一、前言

Hi,大家好,我是承香墨影!

开门见山,开篇名义。今天来聊聊如何将多段视频,拼接成一个完整而连续的视频,然后无缝进行播放。

这样的需求应该不算偏门吧?

最简单的就是一些视频 App,会将大段的视频切割成小段的视频进行播放,还有一些在播放视频之前,会插播一段广告,这些需求都可以被本文的内容覆盖到。

说到多个视频拼接来说,如果你了解过 Google 出的 ExoPlayer 的话,它其内正好有一个 ConcatenatingMediaSource 可以来完成多个视频源的拼接工作,并且 Api 很好用,基本上算是无缝拼接。

不过呢,ExoPlayer 是依赖 MediaCodec 的,除了 Api Level 的限制之外(Api Level 16+),它对设备硬件也是有要求的,在一些低端机上,你会碰到一些莫名其妙的卡顿、马赛克、花屏等问题。而正是因为封装的太好了,如果你想自行添加软解,很遗憾,不太简单。而 Github 上 extensions 中,对 ffmpeg 的支持,也只是仅限于 Audio,对 Video 没有这个支持。

本文是基于另外一个很火的开源播放器:IJKPlayer,来看看如何去拼接视频。

二、IJKPlayer Concat

IJKPlayer 是一个基于 FFmpeg 的轻量级 Android/iOS 视频播放器,被 Bilibili 开源出来,算是国内很火的一款开源播放器了,很多 App 都在用。

因为背靠 FFmpeg,所以你在视频编码解码上碰到的大部分问题,IJKPlayer 都可以帮你解决,是一款非常好用的播放器。

IJKPlayer 本身已经很好用了,你如果想播放多段视频源的话,想要挨个的顺序播放,在要求不高或者本身有转场效果的前提条件下,也不是不可以。可如果是需要那种无缝的衔接,使用这种方式你会发现会有短暂的黑屏,因为加载新的视频源需要经历一小段时间,这种黑屏的现象在越差的设备上,越明显。

对此,我这里推荐的解决方案,就是使用 FFmpeg 的 concat 协议

2.1 什么是 concat

concat 是 FFmpeg 提供的一个虚级联脚本分解器(以下简称 concat 协议),它是以一段有规则的脚本文件的形式存在的。可以使用 concat 定义一个视频播放列表,FFmpeg 在播放的时候,会根据你定义的顺序,一个接一个的解析进行播放,就好像他们本身就是一个视频源一样。

这么解释可能有点不清晰,不过如果你了解 .m3u8 的格式,你对 concat 的理解应该就不难,它们都是定义了一个视频列表,交由播放器的解码器去顺序播放。

具体的信息,可以去 FFmpeg 的官方文档中,查阅对应的内容。

FFmpeg Doc:

https://ffmpeg.org/ffmpeg-formats.html#concat

2.2 concat 文件

想要使用 concat 协议,首先需要定义一个待解析的文件。它必须是以 .ffcat 或者 .ffconcat 后缀结尾,并且文件的内容头,必须标记当前 concat 的版本号。

其内有两个可配置的选项:

  • file:用于指定一个待解析的视频源,它可以指定一个本地的文件路径,或者一个在线的 Uri,都是合法的。
  • duration:标记前一个 file 指定的视频源的长度,根据官方文档的介绍,它是和 seek 相关的,当你调整进度的时候,它可以精准的定位到文件。不过它是一个辅助参数,如果你拼接的视频码率什么的参数都一致,是可以不需要它的,所以 duration 是一个非必须的参数。

下面举个官方的例子来看看一个完整的 .ffcat 文件,应该是什么样子的。

ffconcat version 1.0
# my first filename
file /mnt/share/file-1.wav
duration 20.0
# my second filename including whitespace
file '/mnt/share/file 2.wav'
# my third filename including whitespace plus single quote
file '/mnt/share/file 3'\''.wav'
复制代码

2.3 IJKPlayer 对 concat 的 Options 配置

在使用 IJKPlayer 的时候,会有一些设置是通过 setOption() 方法进行设置的,如果需要支持 concat 协议,同时也需要有对应的设置。

这里主要关注两点:

  1. protocol_whitelist : 协议白名单。
  2. safe:安全路径。

为了让 IJKPlayer 能支持 concat 协议,你需要将 concat 配置到它的白名单协议里,主要是为了添加 ffconcat 和 concat 两个。

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "protocol_whitelist", "rtmp,concat,ffconcat,file,subfile,http,https,tls,rtp,tcp,udp,crypto");
复制代码

而 safe 主要是为了指定允许一些不安全的路径,默认值是 1 ,会拒绝一些不安全的文件路径。当然,什么是安全路径?你可以自行测试或者查阅文档,这里直接将它设置为 0 ,就可以将其安全监测关掉。

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"safe",0);
复制代码

到此,基本上就说清楚关键点了,直接将这个 .ffcat 文件,丢给 IJKPlayer 就可以正常的顺序播放了。

concat 相关的内容非常的少,如果你在实际操作过程中,碰到问题,还是建议关注一下 Logcat 的输出信息,看看出错的原因。当然,通读一遍 FFmpeg 的 concat 文档,也是有帮助的。

三、Concat 查缺补漏

3.1 什么是安全路径

前面提到的,concat 文件中,file 后面跟随的文件路径,必须是一个安全路径,那什么是安全路径?

根据 concat 的文档描述,安全路径必须是一个相对路径,并且只不包含特殊符号,只包含(字母。数字、句点、下划线)等字符,并且路径开始的时候,不包含句点“.”,则认为是一个安全路径。

例如 :

file a.mp4
复制代码

则认为是当前 .ffcat 文件所在目录下的 a.mp4 文件,这是一个安全路径。

相反的,例如 :"https://"、"file://"、"./" 这种视频源路径,均会视为不安全路径。

3.2 ffcat 文件是否一定要在本地

FFmpeg 只是接受一个 concat 协议格式的数据流,具体它是在本地还是在远端的服务器上,其实是不影响的。

3.3 file 是否可以混编

file 后面跟随的视频源的地址,concat 并不强制要求需要都在同一个地方。

ffconcat version 1.0file /sdcard/a.mp4file http://down4.xxx.com/hash/c644d9e118417e56d91cba3dc467ab9b.mp4
复制代码

例如这样一个 .ffcat 文件,它是合法可播放的。

3.4 视频拼接的地方有黑屏闪动

concat 要求拼接的视频必须具有相同的流(相同的码率和时间基准等),所以如果前后两个视频源这些参数不一致,是可能导致闪一下黑屏的。

这个问题,我在非常差的电视盒子上做过测试,如果文件流保持一致,是可以做到无缝衔接。所以如果你也碰到这样的情况,不要怀疑 FFmpeg 的 concat 的问题,重新用 FFmpeg 转码一下你的视频文件再试试吧。

https://github.com/alwaystest/Blog/issues/58

https://www.jianshu.com/p/ea794a357b48

今天在公众号后台回复成长『成长』,将会得到我整理的一些学习资料,也能回复『加群』,一起学习进步。

推荐阅读:

  • 漫画:程序员,你能“管理”好你的产品经理吗?
  • 利用 Kotlin 的特性,优化 Intent 的数据传递!
  • 解决 Lottie 动画包含图片的问题!
  • Google 的 Flutter 学习资料!
  • 远程控制智能电视,方案已开源!

基于 IJKPlayer-concat 协议的视频无缝拼接技术实现相关推荐

  1. 基于HLS流媒体协议的视频加密方案

    本文只讨论应用于浏览器环境的流媒体协议的加密. 背景 付费观看视频的模式是很多平台的核心业务,如果视频被录制并非法传播,付费业务将受到严重威胁.因此对视频服务进行加密的技术变得尤为重要. 本文所指的视 ...

  2. 多个视频画面拼接技术

    ____YUV主要采样格式理解 主要的采样格式有YCbCr 4:2:0.YCbCr 4:2:2.YCbCr 4:1:1和 YCbCr 4:4:4.其中YCbCr 4:1:1 比较常用,其含义为:每个点 ...

  3. SIP协议与视频通信

    一.引 言 通信技术发展到今天,电话网几乎覆盖全球.语音通信(电话)似乎已基本达到在任何时间,任何地点都可以沟通.随着技术的发展,人们已不满足仅仅语音通信,大规模视频通信已成为下一阶段信息产业发展方向 ...

  4. 大屏幕led无缝拼接显示屏的十大技术优势

    无缝拼接屏专指可以实现0mm拼缝显示的液晶拼接大屏幕,它虽然并不是把液晶面板做成无边框的,但却是通过后期的技术手段消除拼缝对画面显示的影响,并且还保持着液晶屏高清分辨率这一优势,使整个大屏幕的显示效果 ...

  5. 音视频开发——通信直播协议和视频推流丨RTMP-RTSP

    近年来直播已成为互联网行业的大热话题,直播答题.游戏直播.竞赛直播,抖音直播,直播教育等层出不穷,直播早已成为人们耳熟能详的技术.事实上直播的兴起不仅与新时代人们要求为自己代言的心理有关,同时也得益于 ...

  6. 【解决方案】基于国标GB28181协议/HIKSDK/Ehome协议EasyCVR智能融合分析平台在智慧校园人脸识别中的应用

    一.建设背景 随着社会的发展,学校规模不断扩大,给校园的安全和科学管理带来了非常大的挑战:随着学校的开放性管理,特别是高校,进出人员复杂,给学校的人员财产安全管理,带来了非常大的挑战.学校安保工作越来 ...

  7. android 基于ijkplayer项目进行的播放器

    jjdxm_ijkplayer 项目地址:jjdxm_ijkplayer 简介:基于 ijkplayer 简单的 UI 界面 当前项目是基于 ijkplayer 项目进行的播放器界面 UI 封装. 是 ...

  8. Photoshop偏移(Offset)命令制作无缝拼接图案

    转载自:http://www.23ps.com/photoshop/cjjc/300003671.htm 如果你仔细观察飞鱼的声纳的黑色背景的话,你会发现其实它并不是纯色的背景.而是一张有着细微质感的 ...

  9. 两段视频如何无缝拼接?如何将两个视频拼接在一起

    两段视频如何无缝拼接?越来越多的人开始习惯于拍摄视频发布在各种平台上.有些人还喜欢拍摄vlog记录自己的生活,拍摄之后整理时,需要将它们合并在一起,如何将两个视频拼接在一起? 软件一:FFmpeg J ...

最新文章

  1. jpa 每次启动都要创建外键索引_什么情况下外键建立索引?是必须的吗
  2. python 代码-我整理的Python代码规则
  3. 091_类数组对象转为数组
  4. Python 三维可视化笔记1 -- TVTK库
  5. js菜单自适应的实现
  6. 【POJ - 2762】Going from u to v or from v to u?(Tarjan缩点,树形dp 或 拓扑排序,欧拉图相关)
  7. 密码学电子书_密码学中的电子密码书(ECB)
  8. Sublime text 2按Ctrl+`无法调出console的可能问题
  9. linux舵机控制程序,Linux PWM设备驱动及舵机控制
  10. RestFul的初步理解
  11. 昵图网学校计算机教室制度,极域电子教室教师端使用说明-20210408211401.docx-原创力文档...
  12. 网站微信扫码支付流程
  13. bootstrap 图标系列
  14. 局部到全局 全局到局部认识之辩解
  15. 【转载】一个游戏地图生成的方案
  16. 苹果开放降级_iOS13不好用?iOS可能将会实现自由降级
  17. 查看,设置,设备的 竖屏-横屏模式 screen.orientation
  18. 如何利用动态代理IP来做SEO(网络营销)
  19. 雅虎黑客事件严重 Verizon表示可能放弃收购
  20. 原生Mysql之and和or混合使用

热门文章

  1. 凯文凯利著作《必然》
  2. Mac提示mysql不是_mysql插入汉字报错。不是mysql是安装在mac系统里的
  3. [Usaco2007 Nov]tanning分配防晒霜
  4. 关于libpthread.a静态链接缺少依赖问题
  5. 结合泛函极值_(二) 泛函的极值
  6. Spring Boot入门教程(五十三): 极光推送Java-SDK
  7. 2022育婴员(五级)判断题及答案
  8. 鸡兔同笼python程序怎么写_鸡肉的做法大全_怎么做好吃_家常做法_下厨房
  9. 反向链接与外链区别,如何查询反向链接?
  10. 蓝桥杯 初赛题目 高斯日记