FFmpeg下载&无损截取HLS视频流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyhaozidx/article/details/84847350

需要用到的工具(有能力达到后面的目的的话,也可以换成其他的):

  • Firefox浏览器 :用来获取m3u8地址
  • PotPlayer:用来播放m3u8地址、加速检查下载的视频
  • FFmpeg:用来下载、截取视频流
  • 记事本:用来编辑FFmpeg命令

以上提供的都是Windows 64位版的官方下载链接,32位和其他系统可以去官网找。

获取HLS视频流的m3u8索引地址

首先,下载安装Firefox浏览器打开,安装上The Stream Detector浏览器扩展。

安装扩展

当检测到网页请求m3u8地址时,扩展图标🎵会进行计数,桌面右下角会弹出提醒。

此时右键扩展图标⇒The Stream Detector,可以看到检测到的链接地址,点击地址即可复制到剪贴板。

左键点击扩展图标会将记录的地址清空。

使用扩展

打开某网站视频播放页,先切换到目标清晰度之外的画质,左键点击扩展图标清空记录。

然后切换到目标画质,此时扩展图标应该会计数,右键图标,点击前面是[M3U8]的地址复制链接到剪贴板。

(复制有可能失败,要注意右下角的提醒,失败了就多点几次试试。)

这时可以打开PotPlayer按CTRL+V来播放剪贴板里的链接,确认目标视频和清晰度是正常的,把链接粘贴备份到记事本里就可以进行下一步了。

(记事本可以勾上格式自动换行,以防链接过长不好编辑。)

FFmpeg抓取HLS视频流

下载解压FFmpeg,放到任何方便的位置就行。

进入bin目录,在路径栏输入cmd然后在当前目录打开命令提示符。

在命令提示符里输入ffmpeg,确认ffmpeg可以正常运行。

(建议在命令提示符标题栏上右键属性,把编辑选项下的快速编辑模式前的√去掉。)

打开cmd

下载完整视频流

复制下面这条命令到记事本,把要下载的链接替换成之前得到的m3u8链接。

输出文件名如果不带路径默认就和ffmpeg.exe同在bin目录下。

输出容器格式由源视频流决定,某网站可以用mp4,mkv、ts等也可以试试。

ffmpeg -i "要下载的链接" -c copy "输出文件名.输出容器格式" 

-i是输入选项其后是输入文件的地址;

-c是输出文件的编码选项,此处值为copy即为复制原视频音频流,避免转码损失画质;

最后是输出文件名,后缀决定了视频容器格式。

例:

ffmpeg -i "http://xxx/.../xxx.m3u8?xxx..." -c copy "test.mp4" 

然后将改好的命令选中复制,在命令提示符里右键粘贴执行即可开始下载。

执行命令

下载好之后可以用PotPlayer打开来查看视频是否正常,ZXC键分别是正常速度、减速、加速播放。

如果视频很长或很大可能需要些时间下载,在下载中途按一次CTRL+C并稍等片刻即可中止(按多次会强行中止,已下好的部分会损坏),已下好的片段能正常播放但想要完整的视频仍需从头开始下,这可以用来测试下载是否正常。

如果输出文件名与已有文件重复会提示是否覆盖,此时输入y为确认,输入其他则会取消。

如果下载的视频播放出现画面停顿等异常,可以尝试在-i前加上-re选项,但下载时间将不会小于视频播放时间。

ffmpeg -re -i "http://xxx/.../xxx.m3u8?xxx..." -c copy "test.mp4" 

无损截取部分视频流

截取本地视频

ffmpeg提供了-ss-t来指定输入源的起始时间和持续时间(即结束时间-起始时间,可以用这个网页来计算)。

如下方的命令就是复制xxx.mp4的2分25秒至3分40秒的视频音频流,保存到test.mp4

ffmpeg -ss 00:02:25 -i "xxx.mp4" -t 00:01:15 -c copy "test.mp4" 

需要注意的是,无损截取只能在i关键帧处切割,而i帧之间可能会有数秒的间距,这意味着如果i帧在24秒的位置且与下一个i帧间隔4秒,那么-ss设定成24-28的值都可能只会在24处切割。

-ss放在-i前的行为就如上所述,如果将-ss放在-i "xxx"后,有可能的情况是音频可以正常切割而视频会到下个i帧处切割从而导致音画不同步。

根据源视频编码的不同,切割可能精确也可能跟设定的差数秒,需要自行测试,如果想要100%精确的切割还是只能重新编码损失画质。

截取HLS视频流

如果源视频不大建议先用上面的方法下载整个HLS视频流到本地,然后在本地截取。

如果源视频很长,只需要其中一部分的话,而且这部分靠近开头,可以先把到目标结束位置的视频流保存下来,再在本地截取。比如想要4到9分钟的视频,就可以先把到10分钟的视频流保存下来(不要指定开始时间,可能会造成音画不同步)。

ffmpeg -i "http://xxx/.../xxx.m3u8?xxx..." -t 00:10:00 -c copy "test.mp4" 
ffmpeg -ss 00:04:00 -i "test.mp4" -t 00:05:00 -c copy "output.mp4"

如果想要的部分靠后的话,想避免大量下载就只能同时指定开始和结束时间。指定起始时间在本地视频上问题不大,但用在网络流上会有大概率造成音画不同步,如果问题出现并且无法解决的话还是建议用上一种方法。

ffmpeg -ss 00:04:00 -i "http://xxx/.../xxx.m3u8?xxx..." -t 00:05:00 -c copy "test.mp4" 

如果其他正常但出现画面停顿、缺失片段,可以加上在-i前加上-re选项,但需要的时间大大增加,最低和截取的时间长度相同。

展开阅读全文

没有更多推荐了,返回首页