首页 > 解决方案 > 给定一个 mp4 列表,生成 fmp4 并连接

问题描述

我的输入是一个 mp4 列表(例如每个是 10 秒),每个 mp4 都会有正确的时间戳,例如第二个 mp4 代表 10 秒 - 20 秒的数据。

为了模拟我的输入,我以这种方式生成了一个 mp4 列表

ffmpeg -i ../origin-long-video.mp4 -map 0 -c copy -f segment -segment_time 10 -force_key_frames "expr:gte(t,n_forced*2)" -reset_timestamps 0 videos/output_%03d.mp4

注意我使用 reset_timestamps 0 以便保留时间戳。

然后我通过使用将每个 mp4 转换为片段 mp4

ffmpeg -y   -i videos/output_001.mp4   -force_key_frames "expr:gte(t,n_forced*2)"   -sc_threshold 0   -s 1280x720   -c:v libx264 -b:v 1500k   -c:a copy   -hls_time 100   -hls_playlist_type vod   -hls_segment_type fmp4   -hls_segment_filename "hls1/file%d.m4s"  -copyts hls1/index.m3u8

上面的 cmd 是针对第一个 mp4 文件的,我对列表中的其他 mp4 做了同样的操作。注意我使用了一个大的 hls_time 以便每个 mp4 将产生一个 fmp4,并且我使用 copyts 来保存时间戳。

然后我想连接例如第二个和第三个 fmp4 来生成一个 mp4,我用

cat init.mp4 > rs.mp4
cat 2nd fmp4 >> rs.mp4
cat 3rd fmp4 >> rs.mp4

但是,当尝试播放生成的 rs.mp4 时,它是 20 秒黑屏,然后是 10 秒视频(对应于 3rd mp4)。

我尝试了另一种方法,它直接生成了一个 fmp4 列表,如下所示:

ffmpeg -y   -i ../origin-long-video.mp4   -force_key_frames "expr:gte(t,n_forced*2)"   -sc_threshold 0   -s 1280x720   -c:v libx264 -b:v 1500k   -c:a copy   -hls_time 10   -hls_playlist_type vod   -hls_segment_type fmp4   -hls_segment_filename "videos/file%d.m4s"   videos/index.m3u8

然后,如果我使用上面相同的方式连接第二个和第三个生成的 fmp4,结果 mp4 播放得很好。

我想知道这两种方法生成的片段 mp4 之间有什么区别,以便它们在连接时导致不同的行为。谢谢!

标签: videoffmpeg

解决方案


推荐阅读