解决加密的HLS(m3u8)视频转换问题

下载视频,遇到一个问题,下载后无法播放,百度一下原来是HLS加密。

M3U8格式分析

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="key.key"   #这个就是密钥
#EXTINF:6.08,
000.ts
#EXTINF:10,
001.ts
#EXTINF:10,
002.ts
#EXTINF:10,
003.ts
#EXTINF:10,
004.ts
#EXTINF:10,
005.ts
......

看下key里是什么内容:

b47fa130f88e8e9a

先把所有的ts以及最重要的key.key都下载下来放到一个目录内。

然后修改m3u8,把里面的所有连接都改成本地相对连接。

F:\迅雷下载\XXXXXXXX>ffmpeg -i list.m3u8 -c copy -bsf:a aac_adtstoasc ALL.mp4
ffmpeg version 2.5.3 Copyright (c) 2000-2015 the FFmpeg developers
  built on Aug  3 2015 16:53:06 with gcc 4.9.1 (GCC)
  configuration: --arch=x86 --cross-prefix=/home/builder/mingw-w64-i686-3.6.4/mingw-w64-i686/mingw-w64-i686/bin/i686-w64-mingw32- --target-os=mingw32 --pkg-config=pkg-config --disa
ble-static --enable-shared --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv -
-enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-li
bopencore-amrwb --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-li
bvo-aacenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libxavs --enable-libxvid --enable-lzma --enable-zlib --enable-libfdk-aa
c --enable-nonfree --enable-dxva2 --disable-sse --disable-sse2 --disable-amd3dnow --disable-amd3dnowext --disable-sse3 --disable-ssse3 --disable-sse4 --disable-sse42 --disable-avx
--disable-os2threads --disable-ffplay --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --prefix=/home/builder/ffmpeg-i686-mw364-trunk --ex
tra-cflags='-m32 -I/home/builder/mingw-w64-i686-3.6.4/mingw-w64-i686/mingw-w64-i686/include' --extra-ldflags='-L/home/builder/mingw-w64-i686-3.6.4/mingw-w64-i686/mingw-w64-i686/lib
 -L/home/builder/mingw-w64-i686-3.6.4/mingw-w64-i686/mingw-w64-i686/bin -static-libgcc -static -lpthread'
  libavutil      54. 15.100 / 54. 15.100
  libavcodec     56. 13.100 / 56. 13.100
  libavformat    56. 15.102 / 56. 15.102
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  2.103 /  5.  2.103
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, hls,applehttp, from 'list.m3u8':
  Duration: 00:26:41.20, start: 1.459000, bitrate: 0 kb/s
  Program 0
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p, 1080x608 [SAR 1216:1215 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 4 kb/s
Output #0, mp4, to 'ALL.mp4':
  Metadata:
    encoder         : Lavf56.15.102
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1080x608 [SAR 1216:1215 DAR 16:9], q=2-31, 25 fps, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 4 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mp4 @ 004c7a00] Non-monotonous DTS in output stream 0:1; previous: 63488, current: 63483; changing to 63489. This may result in incorrect timestamps in the output file.
frame=40030 fps=8265 q=-1.0 Lsize=  105439kB time=00:26:41.31 bitrate= 539.4kbits/s
video:91639kB audio:12393kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.353236%

命令:
ffmpeg -i list.m3u8 -c copy -bsf:a aac_adtstoasc ALL.mp4

红色的是关键部分

PS:我使用的版本是优酷 v7.5.5.5170自带的ffmpeg

其他参考:https://blog.youkuaiyun.com/cnhome/article/details/73250495

### 将本地 M3U8 文件转换为 MP4 的方法 要将本地的 `.m3u8` 文件转换为 `.mp4` 格式的视频文件,可以借助强大的开源多媒体处理工具 FFmpeg 来完成。以下是具体实现方式以及注意事项。 #### 使用 FFmpeg 转换 M3U8 到 MP4 FFmpeg 是一种功能强大且灵活的多媒体框架,支持多种音频、视频格式之间的转换操作[^2]。为了执行此任务,需先确认已正确安装 FFmpeg 并配置到系统的环境变量中。 运行以下命令即可完成转换: ```bash ffmpeg -i input.m3u8 -c copy output.mp4 ``` 上述命令解释如下: - `-i input.m3u8`: 指定输入文件路径为 `input.m3u8`。 - `-c copy`: 表示不重新编码音视频流,而是直接复制原始数据至目标容器(即保持原质量不变)。如果遇到解码失败的情况,则可尝试去掉该参数让 FFmpeg 自动重编码[^1]。 - `output.mp4`: 输出的目标文件名设定为 `output.mp4`。 需要注意的是,当涉及加密 TS 片段时,仅提供 m3u8 清单可能不足以顺利完成整个流程,因为还需要额外指定对应的 key 文件位置或者相关内容以便成功解析加密封包[^3]。 #### 处理带加密 Key 的情况 对于某些受保护的内容而言,除了基本清单外还存在关联的安全机制——AES 加密算法应用于此场景下最为普遍。此时则需要进一步补充关于密钥的信息给 FFmpeg 才能继续工作: 假设您的播放列表指定了外部 KEY URL 如 http://example.com/key ,那么可以通过设置 HTTP header 或者手动下载 KEy 后再告知程序其确切地址来解决这个问题: ```bash ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto" \ -i playlist_with_encryption.m3u8 -c:v libx264 -crf 18 final_output.mp4 ``` 这里增加了几个选项帮助应对复杂的网络请求状况,并强制采用 H.264 编码器生成最终产物以确保兼容性良好。 --- ### 提供一段 Python 实现自动化脚本作为辅助手段 (选填) 如果您希望构建更加自动化的解决方案,也可以考虑编写简单的 Python 脚本来调用子进程执行以上指令: ```python import subprocess def convert_m3u8_to_mp4(m3u8_path, mp4_path): command = [ 'ffmpeg', '-hide_banner', '-loglevel', 'error', '-i', m3u8_path, '-c', 'copy', mp4_path ] result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) if result.returncode != 0: raise Exception(f'Conversion failed:\n{result.stderr.decode()}') if __name__ == '__main__': try: convert_m3u8_to_mp4('path/to/input.m3u8', 'path/to/output.mp4') print("Conversion completed successfully.") except Exception as e: print(e) ``` 此代码片段定义了一个函数用来封装 ffmpeg 命令行接口调用逻辑,便于集成进更大规模的应用当中去。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值