Windows 和 macOS 上使用ffmpeg 进行视频切片

简介

HTTP Live Streaming 是 Apple 为了提高流播效率开发的技术,特点是将流媒体切分为若干 TS 片段(比如每10秒一段),然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。这样做相比使用 RTSP 协议的好处在于,一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了 CDN 边缘服务器的配置要求,可以使用任何现成的 CDN。分发使用的协议是最常见 HTTP,代理服务器对这个协议的缓存优化相当成熟,而很少有代理服务器对 RTSP 的进行缓存优化。这对播放(软)实时视频有相当大的优势,因为这样分发后,对源服务器的负载压力小得多。

对于非实时视频,同样的好处也是存在的:如果你要在一段长达一小时的视频中跳转,如果使用单个 MP4 格式的视频文件,并且也是用 HTTP 协议,那么需要代理服务器支持 HTTP range request 以获取大文件中的一部分。不是所有的代理服务器都对此有良好的支持。而 HTTP Live Streaming 则只需要根据列表文件中的时间轴找出对应的 TS 片段下载即可,不需要 range request,对代理服务器的要求小很多。所有代理服务器都支持小文件的高效缓存。

此外,HTTP Live Streaming 还有一个巨大优势:自适应码率流播(adaptive streaming)。效果就是客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整。

至于为什么要用 TS 而不是 MP4,这是因为两个 TS 片段可以无缝拼接,播放器能连续播放,而 MP4 文件由于编码方式的原因,两段 MP4 不能无缝拼接,播放器连续播放两个 MP4 文件会出现破音和画面间断,影响用户体验。前两年我尝试过一个基于 HTML5      <audio>      标签 + CBR MP3 格式 + Icecast 流媒体服务器的网络广播台的网页应用(预想是给 http://apple4.us 做 Livecast 的,就是听众只需要访问一个网页就能够几乎实时听到访谈节目),采用的正是 HTTP Live Streaming 的思路。通过对 MP3 音频流进行帧切分,基本能做到连续播放。唯一问题是浏览器不支持 TS 格式,    <audio>  标签在两段 MP3 之前切换时会破音。这样只能对谈话类内容适用,如果播放连续的音乐有时候会听出破绽。iOS 设备上启用 HTTP Live Streaming 非常简单,也是苹果官方推荐的方式。Adobe 的 Flash 流媒体服务器的新版本也要支持这个技术的 [2]。这样普及开来是好事,用户体验更好、网络压力更低。

 

流程

1、下载ffmpeg
https://ffmpeg.zeranoe.com/builds/

下载二进制文件后,解压到对应目录:

windows设置环境变量:

macOS,二进制文件复制到/usr/local/ffmpeg,设置环境变量:

 

2、对视频进行转码(转为MP4)
将视频文件转为视频编码h.264,音频编码aac格式的mp4文件

ffmpeg -i out.mp4  -c:v libx264 -strict -2 real.mp4
out.mp4 是待转码的文件(可以是其他格式,比如avi……之类的)
real.mp4 是转码输出文件
libx264 转为 h.264编码

为什么mp4再转码一次呢?因为我这个mp4视频文件不是h.264编码,所以需要再转一次,不然到后面切片的时候会遇到很多莫名其妙的问题。

这个过程一般比较长,根据电脑CPU和视频长度决定。当然也可以使用GPU进行转码,这样更快~
Windows上使用ffmpeg 进行视频切片

 

3、将MP4转换为ts格式文件(单个ts)
命令格式如下:

ffmpeg -y -i 待转换mp4文件路径 -c copy -vbsf h264_mp4toannexb 目标ts文件
ffmpeg -i real.mp4 -c copy -vbsf h264_mp4toannexb output.ts
转码成功后会生成ts文件

Windows上使用ffmpeg 进行视频切片

 

4、将ts切片,并生成m3u8文件

命令格式
ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts


output.ts 已生成的ts文件
playlist.m3u8 待生成的m3u8文件名
5 切片时间,表示隔几秒进行切一个文件
output%03d.ts 生成切割ts文件名,output%03d.ts 代表生成output001.ts、output002.ts这样的格式,03d 可以随意修改,占位符。

这里我新建一个文件夹用了存放切片的m3u8 和 output.ts 文件,那么命令则是

ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list void/playlist.m3u8 -segment_time 5 void/output%03d.ts
Windows上使用ffmpeg 进行视频切片
Windows上使用ffmpeg 进行视频切片
这样就算切片成功了,视频被切割成以5秒大小的ts文件。

 

参考:https://blog.curlc.com/archives/514.html

 

修改时间 2019-04-08

真诚赞赏,手留余香
赞赏
随机推荐
原生JavaScript插件的写法
npm err Cannot read property '0' of undefined
如何通过网页启动应用程序
CSS 实现夜间模式和CSS自定义属性(变量)
JS性能优化 document.createDocumentFragment
上传项目到github
PS手绘20171007
MySQL 开发规范
MySQL 函数 FIND_IN_SET 和 IN 的区别
js解析json中的一个问题