来自视频文件的无限流(循环中)

时间:2015-06-15 13:41:23

标签: video ffmpeg video-streaming avconv

有没有办法如何从视频文件中创建无限h264流(例如mp4,avi,...)。我想使用ffmpeg将avi文件转码为h264,但输出没有loop选项。

3 个答案:

答案 0 :(得分:14)

您应该能够在输入之前使用-stream_loop -1标记-i):

ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i ./test.mp4 -c copy ./test.m3u8

-fflags +genpts将重新生成pts时间戳,使其顺利循环,否则时间序列将在循环时不正确。

答案 1 :(得分:5)

不,你不能。 ffmpeg中没有这样的命令来循环播放视频。您只能将-loop用于图片。如果您有兴趣,可以使用concat demuxer。创建播放列表文件,例如playlist.txt

在playlist.txt内添加视频位置

file '/path/to/video/video.mp4'
file '/path/to/video/video.mp4'
file '/path/to/video/video.mp4'
file '/path/to/video/video.mp4'
file '/path/to/video/video.mp4'

运行ffmpeg

ffmpeg -f concat -i playlist.txt -c copy output.mp4

请参阅here

答案 2 :(得分:0)

如果您想通过循环播放单个视频文件来获得实时流,则可以将其拆分为.ts文件,然后使用php脚本模拟.m3u8文件,该脚本将根据当前时间返回不同的.ts文件。您可以尝试与此类似的东西:

<?php
// lets assume that we have stream splitted to parts named testXXXXX.ts
// and all parts have 2.4 seconds and we want to play in loop part
// from test0.ts to test29.ts forever in a live stream
header('Content-Type: application/x-mpegURL');
$time = intval(time() / 2.40000);
$s1 = ($time + 1) % 30;
$s2 = ($time + 2) % 30;
$s3 = ($time + 3) % 30;
$s4 = ($time + 4) % 30;
?>
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:<?php echo "$time\n"; ?>
#EXTINF:2.40000,
test<?php echo $s1; ?>.ts
<?php if ($s2 < $s1) echo "#EXT-X-DISCONTINUITY\n"; ?>
#EXTINF:2.40000,
test<?php echo $s2; ?>.ts
<?php if ($s3 < $s2) echo "#EXT-X-DISCONTINUITY\n"; ?>
#EXTINF:2.40000,
test<?php echo $s3; ?>.ts
<?php if ($s4 < $s3) echo "#EXT-X-DISCONTINUITY\n"; ?>
#EXTINF:2.40000,
test<?php echo $s4; ?>.ts