从HTTP Live Streaming M3U8文件生成MP4的FFMPEG?

113

我该如何从HTTP Live Streaming (HLS)的m3u8文件中提取mp4?我尝试了以下命令:

ffmpeg -i {input file} -f rawvideo -bsf h264_mp4toannexb -vcodec copy out.mp4

我遇到了这个错误:

[NULL @ 0000000002f07060] 帧头不包含在全局extradata中,流可能已损坏或者是无效的MP4/AVCC比特流。无法为第0个使用codec copy进行的流打开h264_mp4toannexb比特流过滤器: I


1
你可以使用这个扩展程序 https://chrome.google.com/webstore/detail/hls-downloader/apomkbibleomoihlhhdbeghnfioffbej?hl=en - regisbsb
2个回答

274

你的命令完全不正确。输出格式不是rawvideo,而且你不需要使用比特流过滤器h264_mp4toannexb,该过滤器用于将mp4中包含的h264转换为MPEG-TS等使用的Annex B格式。相反,你应该使用aac_adtstoasc来处理AAC流。

ffmpeg -i http://.../playlist.m3u8 -c copy -bsf:a aac_adtstoasc output.mp4

你好,这个答案帮助我从m3u8 url录制直播流,并且视频也保存在output.mp4中。我的问题是,我们能否在这个命令中指定以秒/分钟为单位的时间,以便保存的视频是指定的时间长度。目前它会一直录制,直到我在控制台按下q键才停止。提前致谢。 - Mayuri Ruparel
1
@Mayuri 在输入后面加上 -t <time>,时间以秒或hms.ms表示。 - aergistal
嘿,有人能帮我获取相同情况下的下载进度吗? - Shivam Parmar
对于一些 ffmpeg 拒绝转储的 m3u8 文件,仍然可以通过 vlc > 打开网络流 > 流输出: 设置 > 文件 来完成。 - ccpizza
似乎需要 http 部分,如果给定一个离线的 .m3u8 文件,ffmpeg 就不会执行任何操作。不知道为什么。 - Minh Nghĩa
@MinhNghĩa 请检查控制台输出,你可能需要启用“-protocol_whitelist file”以允许本地M3U8访问。 - aergistal

26

Aergistal提供的解决方案有效,但我发现将视频转换为mp4可能会导致某些m3u8视频无法播放。如果你遇到这个问题,请尝试将它们转换为mkv格式,然后再转换为mp4。


64
我发现 ffmpeg -i http://...m3u8 -c copy live.mkv 运行得非常好。如果有人看到这条信息,就可以参考一下。 - rwenz3l
@blackmiacool:如何通过编程实现这个? - Vineesh TP
3
如果您的网址是以https://开头,请将其改为http://,否则将出现“HTTP错误403禁止”错误... 将MKV转换为MP4只需使用ffmpeg -i file.mkv file.mp4命令,但为什么要这样做呢? - Erich Kuester
10
对于本地的 m3u8 文件,我还需要在前面添加一个白名单,比如说:ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i 02.m3u8 -c copy 02.mkv - Bill Kotsias
@ErichKuester 但问题中有一个“MP4”。 - blackmiaool
显示剩余4条评论

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