ffmpeg使用与m3u8文件
ffmpeg是一个可以用来对视频、音频做各种处理的工具。参数很多,但是常用的也就几个。
例子
1
| ffmpeg {全局参数} {输入文件参数} -i {输入文件} {输出文件参数} {输出文件}
|
-c:指定编码器
-c copy:直接复制,不经过重新编码
-c:v:指定视频编码器
-an:去除音频
-vn: 去除视频
-b: 指定码率 例如[-b:v 0.9M] 指定视频的码率
最简单的使用方法为:
1
| ffmpeg -i "原始文件.mkv" "输出文件.mp4"
|
需要注意的是当原始文件/输出文件的文件名中存在特殊字符的时候(空格等),需要使用双引号。
在前段时间尝试抓取一些视频平台的视频内容时,发现很多网站使用了m3u8(播放列表)+xxx.ts(视频文件)的方式.其中m3u8文件为播放列表文件,随后的*.ts文件为实际的视频文件。
其中m3u8大致内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:4 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHOD=AES-128,URI="https://meiju10.zzwc120.com/20200506/LSub3Wch/3000kb/hls/key.key" #EXTINF:2.419, https://meiju10.zzwc120.com/20200506/LSub3Wch/3000kb/hls/rcfPCjXD.js #EXTINF:2.085, https://meiju10.zzwc120.com/20200506/LSub3Wch/3000kb/hls/CGh71YAo.js #EXTINF:2.085, https://meiju10.zzwc120.com/20200506/LSub3Wch/3000kb/hls/sd7ZiHFL.js . . . . . #EXT-X-ENDLIST //结束
|
几个重要的tag:
- EXTM3U:必须包含的头
- EXT-X-VERSION:版本
- EXT-X-KEY:
- 加密方法以及密钥,这个tag有可能出现在文件头,或者每个分片上面
- METHOD: 加密方法,一般为aes-128
- URI: AES解密使用的KEY文件的地址。
- IV: AES解密使用的IV
- EXTINF: 各个分片
基本下载的流程就是:下载m3u8->解析->下载对应的ts->看是否按需解密->合并ts文件.
ffmpeg可以直接下载m3u8:
1
| ffmpeg -i https://XXXX/video.m3u8 -c copy output.mp4
|
需要注意的是ffmpeg目前版本对于ts文件的下载是单线程的,效率很低。如果存在加密的问题,也会比较麻烦,因为一般的网站都会对对应的key做访问限制。可能需要添加对应auth的cookie。
AesDecrypt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public static byte[] AesDecrypt(byte[] data, byte[] key, string iv = "") { using (var rm = new RijndaelManaged()) { if (key == null || key.Length == 0) return data; rm.Key = key; if (!string.IsNullOrWhiteSpace(iv)) { var tmpIv = iv.Replace("0x", "").Trim(); var buff = new byte[tmpIv.Length / 2]; for (var index = 0; index < buff.Length; index++) { var vStr = tmpIv.Substring(index * 2, 2); buff[index] = Convert.ToByte(vStr, 16); }
rm.IV = buff; }
var cTransform = rm.CreateDecryptor(); var resultArray = cTransform.TransformFinalBlock(data, 0, data.Length); return resultArray; } }
|