如何在iOS中下载和解密HTTP Live Streaming(HLS)视频?

22

我想要下载M3U8文件的分块(HLS),并在解密后存储该视频以便以后观看。我已经制作了一个演示来播放M3U8文件,但我想要下载视频数据以便稍后查看。


1
你是如何播放HLS流的?是在浏览器中使用普通的<video>标签吗? - Brad
1
你在哪一步遇到了问题?你需要下载视频数据,用解密密钥进行解密,并将结果数据保存到文件中。或者你在播放结果文件方面遇到了问题? - vipw
我在下载M3U8文件数据方面遇到了麻烦。但是,我的需求现在已经改变了。将下载MP4以供以后观看。而在流媒体的情况下,需要在iOS端播放加密的HLS。我该如何在iOS上播放加密的HLS? - NSPratik
不,@DmitryDonskoy。下载M3U8并播放它...HLS并非为此类意图而设计。它仅用于流媒体。否则,苹果会提供一个工具来下载M3U8内容。如果您想将视频存储以供以后观看,则必须下载MP4(或其他在iOS中支持的视频格式)。 - NSPratik
1
@NSPratik,谢谢你的回答。我找到了这个https://github.com/kencool/KSHLSPlayer 看起来有人可以从流中存储视频。我正在尝试编译和检查它。也许它会有用。 - Dmitry L.
显示剩余3条评论
6个回答

54
您可以使用FFmpeg来下载和解码HTTP-LS流:
ffmpeg -i http://example.org/playlist.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4

有一个可用的iOS版本的ffmpeg


我不得不添加 -protocol_whitelist“ file,http,https,tcp,tls”,因为我看到了 Protocol 'https' not on whitelist 的错误提示。总的来说,这就是我需要的命令。谢谢! - TastyWheat

6
这个Perl脚本是一个不错的抓取工具:https://github.com/osklil/hls-fetch 步骤:
wget https://raw.githubusercontent.com/osklil/hls-fetch/master/hls-fetch
chmod +x hls_fetch
./hls_fetch --playlist "THE_URL"

THE_URL替换为您的M3U8播放列表的完整URL(或尝试使用--help进行其他选项)。

奖励:如果您缺少Perl的JSON模块(就像我一样),只需运行sudo cpan JSON即可。


$ ./hls-fetch --help 在 @INC 中找不到 JSON.pm(您可能需要安装JSON模块)(@INC包含:/home/valya/perl5/lib/perl5 /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) 在./hls-fetch第24行。 开始失败-在./hls-fetch第24行中终止编译。 - Lebnik
@Lebnik,你看过我安装缺失的JSON模块的额外提示了吗? - sequielo

4

还有一款Chrome扩展程序,它可以从m3u8块中生成完整视频,这是链接HLS Video Saver


2

1

1

网址: https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8

步骤1:ffmpeg -i 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8' -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease -c:a aac -ar 48000 -b:a 128k -c:v h264 -profile:v main -crf 20 -g 48 -keyint_min 48 -sc_threshold 0 -b:v 2500k -maxrate 2675k -bufsize 3750k -hls_time 10 -hls_playlist_type vod -hls_segment_filename my_hls_video/720p_%03d.ts my_hls_video/720p.m3u8

步骤2:

-i 'https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8' :=> 将https://mnmedias.api.telequebec.tv/m3u8/29880.m3u8设置为视频源。

-vf "scale=w=1280:h=720:force_original_aspect_ratio=decrease" :=> 将视频缩放至最大可能的1280x720,同时保持纵横比。

-c:a aac -ar 48000 -b:a 128k :=> 将音频编解码器设置为AAC,采样率为48kHz,比特率为128k。

-c:v h264 :=> 将视频编解码器设置为H264,这是HLS段的标准编解码器。

-profile:v main :=> 将H264配置文件设置为主要配置文件,这意味着现代设备可以支持。

-crf 20 :=> 恒定速率因子,用于整体质量的高级因素。

-g 48 -keyint_min 48 :=> 每48帧(约2秒)创建一个关键帧(I帧)非常重要 - 这将影响片段的正确切片和渲染版本的对齐。

-sc_threshold 0 :=> 不根据场景变化创建关键帧,只根据-g参数。

-b:v 2500k -maxrate 2675k -bufsize 3750k :=> 限制视频比特率,这些是版本特定的,取决于您的内容类型 - 阅读更多信息。

-hls_time 4 : :=> 片段目标持续时间(以秒为单位)- 实际长度受关键帧约束。

-hls_playlist_type vod :=> 添加#EXT-X-PLAYLIST-TYPE:VOD标签,并将所有片段保留在播放列表中。

-hls_segment_filename beach/720p_%03d.ts :=> 明确定义片段文件名 my_hls_video/720p.m3u8 - 播放列表文件路径 - 同时告诉FFmpeg输出HLS(.m3u8)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接