使用FFmpeg合并/解密/下载m3u8文件转为mp4格式

情况

网上一些视频资源(课程/节目),有时我们想下载到本地。
如果是直接播放的mp4一类没有问题,直接下载就OK了。
但是有些是用js播放的一个xxx.m3u8文件,里面是一堆.ts视频文件,并且经过了aes-128加密。。。

解决

最简单的解决方式是用FFmpeg这个软件。
直接指定m3u8文件的url,输出成本地的mp4。

D:\XXX\ffmpeg\bin>ffmpeg -i https://www.theurl.com.cn/videos/thepath/index.m3u8 -c copy d:\output.mp4

不需要下载key,
不需要迅雷分别下载所有的*.ts视频文件
不需要修改m3u8内容。
不需要注意m3u8里面本地斜杠是/还是\的问题。
真是so easy。

具体执行返回如下:

ffmpeg version git-2020-08-31-4a11a6f Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.2.1 (GCC) 20200805
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
  libavutil      56. 58.100 / 56. 58.100
  libavcodec     58.101.101 / 58.101.101
  libavformat    58. 51.101 / 58. 51.101
  libavdevice    58. 11.101 / 58. 11.101
  libavfilter     7. 87.100 /  7. 87.100
  libswscale      5.  8.100 /  5.  8.100
  libswresample   3.  8.100 /  3.  8.100
  libpostproc    55.  8.100 / 55.  8.100
[hls @ 00000156bf0dda40] Skip ('#EXT-X-VERSION:3')
[hls @ 00000156bf0dda40] Opening 'https://www.theurl.com.cn/videos/thepath/ts.key' for reading
[hls @ 00000156bf0dda40] Opening 'crypto+https://www.theurl.com.cn/videos/thepath/index0.ts' for reading
Input #0, hls, from 'https://www.theurl.com.cn/videos/thepath/index.m3u8':
  Duration: 00:07:31.47, start: 1.445333, bitrate: 0 kb/s
  Program 0
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1280x704 [SAR 1441:1440 DAR 131:72], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 0
Output #0, mp4, to 'd:\output.mp4':
  Metadata:
    encoder         : Lavf58.51.101
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x704 [SAR 1441:1440 DAR 131:72], q=2-31, 30 fps, 30 tbr, 90k tbn, 90k tbc
    Metadata:
      variant_bitrate : 0
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp
    Metadata:
      variant_bitrate : 0
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[hls @ 00000156bf0dda40] Opening 'crypto+https://www.theurl.com.cn/videos/thepath/index1.ts' for reading
[hls @ 00000156bf0dda40] Opening 'crypto+https://www.theurl.com.cn/videos/thepath/index2.ts' for reading
[hls @ 00000156bf0dda40] Opening 'crypto+https://www.theurl.com.cn/videos/thepath/index3.ts' for reading
[hls @ 00000156bf0dda40] Opening 'crypto+https://www.theurl.com.cn/videos/thepath/index4.ts' for reading
……
……
frame=13544 fps=119 q=-1.0 Lsize=   61614kB time=00:07:31.47 bitrate=1118.0kbits/s speed=3.96x
video:54037kB audio:7238kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.553732%

多研究一下

M3U:简单说就是一种播放资源索引(列表)文件。


M3U8:也是M3U文件的一种,采用UTF8格式。是 HLS 实况流媒体协议格式的基础。简单说呢,就是把视频/直播,变成一个个小的片段,通过HTTP协议下载和播放。

文件大概样子如下,细节不搬运了,查其它资料吧:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://www.theurl.com.cn/videos/thepath/ts.key",IV=0x00000000000000000000000000000000
#EXTINF:4.000000,
index0.ts
#EXTINF:4.000000,
index1.ts
#EXTINF:4.000000,
index2.ts
#EXTINF:4.000000,
……
……
#EXT-X-ENDLIST


FFmpeg:一个完整的,跨平台的流媒体录制/转换解决方案。
官网地址:http://ffmpeg.org/
Windows平台builds:https://ffmpeg.zeranoe.com/builds/ 貌似马上关站了???
其实很多视频处理软件,都会调用FFmpeg。


OpenSSL的失败尝试:

>openssl aes-128-cbc -d -kfile ts.key -iv 00000000000000000000000000000000 -nosalt -in index1.ts -out output1.ts

无论Windows还是Linux下,都会报错,行数还不一样……
没研究出来怎么回事。

猜你喜欢

转载自blog.csdn.net/ddrfan/article/details/108463859