使用Python脚本调用ffmpeg下载ts分段视频文件

1,164 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天 点击查看活动详情

前言

现在的在线视频都不是mp4的格式的了,都是一种ts的文件格式,为了防止盗版,以及流量和带宽的滥用,ts文件格式是一种视频分段的的技术,主要是需要一个索引文件列出该视频所有的分段信息,有时长和一些ts文件名的信息:

image.png

这些子分段信息在播放的时候异步加载,跳转的时候也非常方便,直接计算时长跳过某些分段的加载。

image.png

单独下载某个ts文件是不能直接播放的,那么怎么解决这个问题呢?有很多方法,我找到了最适合我们这种技术人的方案,就是使用著名的ffmpeg,可以直接使用ffmpeg命令行访问远程索引文件下载并合并成一个MP4文件。今天就来简单介绍一下用法。

下载

ffmpeg是一款非常好用处理音视频的软件工具包,在Win10中使用ffmpeg需要下载后再添加环境变量,下载网站:Download FFmpeg

image.png

下载完成后解压,把解压后的文件移动到一个合适的位置:

image.png

添加环境变量,可以参考上上篇文章Fiddler无法抓取HTTPS链接?通过Root权限将Fiddler证书移入系统根证书目录 配置Opnen SSL一样,这里只展示最后的配置完成的情况:

image.png

此时命令行看下环境变量是否正确:

ffmpeg -version

image.png 成功安装

下载

下载要找到需要下载网站的索引文件的链接,我这里在浏览器F12调试台查看到:

image.png

假如使用原生命令下载的命令是:

ffmpeg -i {m3u8链接} -c copy -bsf:a aac_adtstoasc {文件名}.mp4'

使用原生命令可以直接下载,但是在Python命令行中 Win10系统无法识别到ffmpeg的环境变量: 所以说要加上ffmpeg的具体目录,这里就简单做一个函数展示如何使用Python调用ffmpeg下载视频:


def one_video(urls, file_name):
    save_path = 'D:\Download\ts\'+file_name
    shell_str = 'D:\MiniTool\ffmpeg\bin\ffmpeg.exe -i '+url+' -c copy -bsf:a aac_adtstoasc '+save_path+'.mp4'
    os.system(shell_str)
urls = 'https://*****/videos/augdeduuigdrypzmvseh/index.m3u8?token=eyssddcflgjkmddsds********' 
file_name = 'test'
one_video(urls, file_name)

效果:

image.png

image.png

总结

ffmpeg是一个非常强大的工具,但是在脚本中单线程是在太慢了,文件大文件多的话非常慢,我准备在Scrapy 中使用它。

还有就是这个m3u8索引文件是一个非常重要的文件,一般是有加密的,在我的例子中有一个token重放保护,是一次访问的,第二次访问会过期,需要在网页中解密到这个token,其他没有问题,但是实际情况中一般更复杂。