video - 给定一个 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 之间有什么区别,以便它们在连接时导致不同的行为。谢谢!
解决方案
推荐阅读
- python - 根据主要颜色激活/停用像素
- c# - .NET Core 端点 + 全局 CORS
- java - 由于 HttpExchange 要求 sendResponseHeaders(int,long) 必须在 getResponseBody() 之前,我该如何处理传输文件?
- c# - oracle选择计数查询在c#中不起作用
- amazon-dynamodb - 如何将 5000 条记录写入 DynamoDB 表?
- c++ - 在编译中包含 botan 2
- xslt-1.0 - XSLT 1.0:如何从字符串中只删除一个空格?
- macos - Macbook Air - 已安装 CodeBlocks - 终端未运行我的代码
- android-studio - 将图像传输到 kotlin 中的其他活动
- python - 如何从列表列表中一次为函数提供一个值?