如何解决制作小片段时,FFmpeg下载整个直播流
设置
我正在使用FFmpeg从M3U8视频生成视频剪辑。该命令如下所示:
ffmpeg -ss <start> -i <1080p-chunklist-url> -c:v copy -c:a copy -t <duration> -f mp4 -y out.mp4
例如,要为特定视频从5分钟标记开始创建30秒的剪辑,命令将为:
ffmpeg -ss 300 -i https://example.com/path/to/1080p/index.m3u8 -c:v copy -c:a copy -t 30 -f mp4 -y out.mp4
我已经知道的一些警告:
- 如果
-ss
在之后-i
之后,则FFmpeg将尝试下载整个M3U8而不是仅下载相关的TS文件,并将解析整个视频内容以寻找确切的时间戳。通过将-ss
放在之前 -i FFmpeg使用“搜索点”,这对于HLS视频意味着它查看M3U8,并且仅下载相关的TS文件 - TS文件边界在HLS中充当“搜索点”,因此,如果TS文件从4:51开始,而下一个TS文件从5:01开始,则此命令将从4:51而不是5开始剪辑: 01(首选在请求时间之前的第一个搜索点)
-
-t
参数设置了确切的剪辑持续时间而不是结束位置,因此,在上面的剪辑始于4:51的示例中,同一剪辑将在5:21而非5:30结束
从理论上讲,我可以使用-to
而不是-t
来指定5:30的结束时间,但是实际上这没有用。同样,从理论上讲,我可以强制-accurate_seeking
从4:51到5:00丢弃内容,并在需要的地方开始剪辑,但是我了解到,这仅适用于转码,而不适用于transmux
现在我要解决的问题是
问题
如果提供的M3U8 URL是实时流(没有#EXT-X-ENDLIST
标签),则FFmpeg无法正常运行。在FFmpeg版本4.2.1和更低版本上,它首先下载包含我的片段的TS文件,然后继续下载M3U8中的 每个 TS文件,然后在等待时挂起新的TS文件可用,甚至可以在我想剪辑的部分结束后 小时 出现时下载它们。在FFmpeg版本4.2.2和更高版本中,我可以创建剪辑,只要它们在倒数第二个TS文件之前结束即可。如果实时流当前具有20分钟的视频数据,并且我创建了19:30-19:40的剪辑(假定倒数第二个TS文件持续时间在倒数第二个TS文件的开始处结束)它的行为与4.2.1相同:无限等待下载整个视频。
我认为“从头开始有2个TS文件”规则与FFmpeg对视频的初步探查有关,以获取流数据。在上述20分钟的长视频中,如果我从3:00到3:30(在流结束之前)进行剪辑,它将首先下载TS文件119和120(19:40-19:50和19) :50-20:00),然后显示视频中的流列表(音频,视频,元数据), 然后 会下载TS文件19-21(包含我想要剪辑的实际数据)
有没有一种方法可以修复它,以便我可以在实时M3U8的“末端”附近正确制作部分的剪辑?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。