最近对抖音有点上瘾,经常看到这样的视频列表:

由于抖音平台的限制,用户最多只能上传60s的视频,因此分段为3个视频。而在视频列表的缩略图模式下,三个视频的封面恰好组合成一张图像。这种方式比较符合审美标准。

接下来跟我一起探讨一下怎么实现,以及背后的原理。

1.验证平台

使用三个平台进行测试视频缩略图展示视频——PC、iPhone、tiktok苹果客户端

2.如何将图片叠加到视频最前面

视频拼接剪辑就不说了,那如何将图片叠加到视频序列前面呢?

由于图片经常是jpeg编码,而视频呢通常是avc或hevc编码,因此绝不能生搬硬套数据进行cat!介绍两种方法进行操作:

    2.1 比较傻和粗糙的方式

把图片和视频,都解码成yuv数据,然后yuv数据进行数据拼接cat,再编码,就形成了视频序列。

    2.2 比较简洁的方式

来自于视频拼接的原理,把jpeg变成一个视频流,不就可以进行两段视频的拼接了嘛!

如何做?使用万能工具ffmpeg!

这里分两小步:step1.图片转为视频;step2.再与主视频拼接。

           step1:

ffmpeg.exe -i img.jpg -vcodec libx264 -s 720x1280 output_img.mp4

如上命令行中,-s指定了生成视频的分辨率,因为要与待拼接的真正主视频分辨率一致(其实不一致也是允许的)。

           step2:

ffmpeg.exe -f concat -i filelist.txt -c:v copy -an output_video.mp4

其中,filelist.txt指定了文件列表(内容格式网上去搜,一大堆资料),-c:v copy指视频拷贝,-an指不要音频。

    2.3 其他说明:

1.图片生成的那个视频文件其实只有一帧数据,帧类型为关键帧(I帧)。

2.两个视频concat后(其实就是数据的cat,并且需要符合mp4规范),会出现前两帧都是IDR关键帧,如下所示:

3.在播放时,对于解码器来说,需要先后初始化两次再解码,因为其内部前两个I帧前都带了SPS/PPS数据,来解码不同编码参数的编码数据。

3.如上视频拼接了,预览时能展示封面图片了吗?——不一定!

这里要说的是,因为每个平台(Win/iPhone/Android/tiktok)机制不太一样,预览展示的不一定是首帧画面!有些抽取首帧,而有些抽取最接近某个时刻的关键帧。

4.一些尝试,生成不同的视频文件

    test1. 图片仅编码一帧(I帧)行程视频,后面再跟主视频进行拼接

    test2. 图片编码25次(1s的视频),一帧I帧和后续共24帧的B帧和P帧,再与主视频拼接

    test3. 图片编码若干次,使达到5s,然后再与主视频拼接

    上面test1-test3利用图片生成视频方法类似,分别为:

        ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 1 -r 25 img_1f.mp4
        ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 25 -r 25 img_1s.mp4
        ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720x1280 -frames 125 -r 25 img_5s.mp4

        其中,参数-r 25指以25fps读取输入文件img.jpg,-loop 1指循环利用输入文件,-frames指欲编码输出的总帧数,后面跟着的 -r 25指输出文件的帧率,最后为输出文件名(后缀名代表图片的数量或时长)。

    利用上面生成的视频,与主视频拼接,命令行为:

        ffmpeg.exe -f concat -i filelist.txt -c:v copy -an output_xx.mp4

    最终生成的视频,利用工具进行分析,分别如下:

       

5.验证结果

在三个平台上验证:PC(Win10),iPhone7, tiktok

结果公示:

    1.图片编码为一个I帧,再跟主视频进行拼接
       PC——主视频的首帧
       iphone——图片
       tiktok——频闪(图片和主视频守帧)

    2.图片编码25次达到1s时间,再与主视频拼接
       PC——主视频的首帧
       iphone——图片
       tiktok——图片

    3.图片编码若干次,使达到5s时间,再与主视频拼接
       PC——图片
       iphone——图片
       tiktok——图片

6.测试中的一些发现

     1.苹果手机环境下,上传视频到tiktok,会重编码为h264,关键帧间隔时长为1s,并且编码帧带B帧,使用high profile档次。更关键的是,使用了苹果自身的硬件编码器和封装器。

        如何看出来呢?上传后,再下载下来。视频文件的MediaInfo信息:

        

     2.安卓机上传,使用了x264(core 148)转码。

该条结论无直接证据,是间接得到的。因为随机下载了几个视频,编码参数(NAL unit type中的SEI数据)都是一致的。

     3.上传转码时,什么场景下使用h265编码,还不清楚。

缩略图调查——抖音客户端/PC/iphone的更多相关文章

  1. Python3实现自动点赞抖音小姐姐

    什么是抖音 抖音是2016年9月上线的一款音乐创意短视频社交软件,是一个专注年轻人的15秒音乐短视频社区.用户可以通过这款软件选择歌曲,拍摄15秒的音乐短视频,形成自己的作品. 效果 抖音经常能刷到很 ...

  2. 快速实现抖音的分享&登录(android)

    快速实现抖音分享与第三方登录 准备工作 1.注册抖音的key到抖音开放平台,点击这里查看步骤: 2.集成ShareSDK到Mob官网文档页面查看即可,点击这里查看集成: 业务代码 分享要求: 视频: ...

  3. 手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 编译期插桩

    抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15% 原创 Leo 字节跳动技术团队 2019-08-09 https://mp.weixin.qq.com/s/Drmmx5JtjG ...

  4. Python 爬虫——抖音App视频抓包

    APP抓包 前面我们了解了一些关于 Python 爬虫的知识,不过都是基于 PC 端浏览器网页中的内容进行爬取.现在手机 App 用的越来越多,而且很多也没有网页端,比如抖音就没有网页版,那么上面的视 ...

  5. 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家.. 1.楼主首先使用Fiddler4来抓取手机抖音app这 ...

  6. iOS 仿抖音 视频裁剪

    1.最近做短视频拍摄.其中的裁剪界面要做得和抖音的视频裁剪效果一样 需求:  裁剪有一个最大裁剪时间.最小裁剪时间.左右拖动可以实时查看对应的视频画面.拖动进度条也能查看对应的画面 .拖动底部视图也能 ...

  7. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  8. 抖音C#版,自己抓第三方抖音网站

    感谢http://dy.lujianqiang.com技术支持 文章更新:http://dy.lujianqiang.com这个服务器已经关了,现在没用了 版权归抖音公司所有,该博客只是为交流学习所使 ...

  9. JavaWeb-SpringBoot(抖音)_二、服务器间通讯

    JavaWeb-SpringBoot(抖音)_一.抖音项目制作 传送门 JavaWeb-SpringBoot(抖音)_二.服务器间通讯 传送门 JavaWeb-SpringBoot(抖音)_三.抖音项 ...

随机推荐

  1. 新手接触springboot

    新手使用springboot或者说,刚接触java行业,有些不明白的就是项目的架构是怎么样的,我今天在这儿稍微整理了一下 有些新手可能在想,springboot是怎么解决最原始的增-删-改-查, 快速 ...

  2. 确成硅化+恒力+苏大文正节点2 oracle ora-4030 错误pga version:11204

    Errors in file /u01/app/oracle/oracle/diag/rdbms/orcl/orcl/trace/orcl_j000_61543.trc (incident=18009 ...

  3. Java基础一篇过(八)常见异常速查

    一.引言 开发过程中可能会遇到各种各样的异常,这里还是汇总一些比较典型的异常,有些比较直观的异常如空指针这种就不写了,此文可作为异常速查用. 二.异常大军正在来袭~ IllegalArgumentEx ...

  4. jfinal3连接sqlserver2012 使用generator生成model 将smallint默认为string

    修改MetaBuilder的buildColumnMetas方法增加对smallint的判断

  5. 《Duubo系列》-Dubbo服务暴露过程

    我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...

  6. 百度地图四(Android百度地图Poi检索开发总结)

    https://blog.csdn.net/wenzhi20102321/article/details/54575999

  7. 51单片机I2C总线

    I2C总线是飞利浦公司推出的一种串行总线,所有器件共用两根信号线,实现数据的传输. 总线接口接了上拉电阻,默认为高电平,所以就可以用"当低电平出现"来标记出一种起始信号.我个人把它 ...

  8. golang拾遗:指针和接口

    这是本系列的第一篇文章,golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识.想做本系列的契机其实是因为疫情闲着在家无聊,网上冲浪的时候发现了zhuihu上的go语言爱好者 ...

  9. 树型大融合——NOIP提高组2015 D1T3 【运输计划】

    下午用一个小时看了一下树上差分,打了个差分模板,A了3题,真的爽! 题目描述: 公元2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 ...

  10. 解决mvn clean install的报错The packaging for this project did not assign a file to the build artifact

    解决mvn clean install的报错The packaging for this project did not assign a file to the build artifact