如何设置使用ffmpeg生成管道mp4的总文件持续时间?

时间:2018-07-15 12:17:38

标签: ffmpeg

我的任务是生成(通过管道传输,以便可以与生成同时播放一个文件)一个mp4文件,该文件是较大文件的一部分,其结果看起来像一个静态文件链接,在完全加载之前(即支持范围标头)。

这是我现在的操作方式:

ffmpeg -ss $ 1 -i /root/nextpro-livestream/replay/teststream_hls1_replay.mp4 -t $ 2 -timecode $ 3 -codec copy -movflags frag_keyframe + faststart -f mp4 pipe:1

结果正常(视频从正确的位置开始),但播放器看不到文件的总时长,因此控制栏看起来很奇怪,并且无法正常进行查找,只是因为控制栏一直在跳。 / p>

我如何向ffmpeg指示必须将moov原子设置为包含正确的持续时间?

问题基本上可以归结为:当我生成片段化的mp4时,如何在moov原子中强制设置文件的任意持续时间? ffmpeg不会知道会持续多久,所以可以解释的是它本身无法做到,但是我知道...是否有命令行参数指定“强制持续时间”?

1 个答案:

答案 0 :(得分:1)

即使可以将moov atom设置为包含正确的持续时间,玩家仍将无法正确搜索。由于管道的性质,播放器需要顺序处理视频。可以向前或向后搜索视频多少秒,取决于播放器正在缓存多少视频数据。

例如,在mpv中,您可以将前向缓存和后向缓存分别设置为4 MiB和2 MiB:

ffmpeg [..] | mpv - --cache=yes --demuxer-max-bytes=4MiB --demuxer-max-back-bytes=2MiB

如果视频的比特率是100 KiB / s,则从当前时间戳记开始,向前和向后搜索的时间分别不能超过40s和20s。

对于某些玩家,可能更希望通过设置-movflags empty_moov将持续时间设置为0。就您而言:

ffmpeg -ss $1 -i /root/nextpro-livestream/replay/teststream_hls1_replay.mp4 -t $2 -timecode $3 -codec copy -movflags frag_keyframe+empty_moov -f mp4 pipe:1

这样,播放器的控制栏不会一直跳下去,因此用户将能够更正确地进行搜索。但是,搜寻量仍然受到玩家缓存的限制。

如果您确实希望用户能够搜索任何时间戳,则需要将协议从pipe更改为filehttpother protocols supported by ffmpeg。您可能不需要生成片段化的mp4视频(-movflags frag_keyframe),但可能仍需要设置-movflags +faststart