Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video FFmpeg制作小片段时下载整个直播流 安装程序_Video_Ffmpeg - Fatal编程技术网

Video FFmpeg制作小片段时下载整个直播流 安装程序

Video FFmpeg制作小片段时下载整个直播流 安装程序,video,ffmpeg,Video,Ffmpeg,我正在使用FFmpeg从M3U8视频生成视频剪辑。该命令如下所示: ffmpeg -ss <start> -i <1080p-chunklist-url> -c:v copy -c:a copy -t <duration> -f mp4 -y out.mp4 我已经注意到一些注意事项: 如果-ss在-i之后出现,则FFmpeg将尝试下载整个M3U8,而不仅仅是相关的TS文件,并将解析整个视频内容以查找准确的时间戳。通过将-ss放在-i FFmpeg使用“搜

我正在使用FFmpeg从M3U8视频生成视频剪辑。该命令如下所示:

ffmpeg -ss <start> -i <1080p-chunklist-url> -c:v copy -c:a copy -t <duration> -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的结束时间,但是在实践中,这不起作用。理论上,我也可以强制
-accurial\u seeking
放弃4:51到5:00的内容,并在我想要的地方开始剪辑,但我知道这只适用于转码,而不适用于转码

现在谈谈我问题的实质:

问题 当提供的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文件持续时间为10秒),那么它的行为将与4.2.1相同:无限等待下载整个视频

我认为“2 TS files from The end”规则与FFmpeg最初探测视频以获取流数据有关。在前面提到的20分钟长的视频中,如果我在3:00到3:30(在流结束之前)制作一个剪辑,它将首先下载TS文件119和120(19:40-19:50和19:50-20:00),然后显示视频中的流列表(音频、视频、元数据),然后下载TS文件19-21(包含我想要的剪辑的实际数据)


有没有办法修复它,这样我就可以正确地在“结尾”附近制作片段关于实时M3U8?

我还没有找到解决此问题的方法,但我找到了解决方法。我自己下载M3U8并对其进行解析,以确定哪些TS文件包含我要剪辑的片段,然后我将TS文件下载到临时目录并使用FFmpeg的“concat”协议将所有TS文件作为单个视频读取并提取我的剪辑
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