video - 连接 mkv 文件,保持原始时间戳和间隙

标签 video ffmpeg video-processing ffmpeg-php

16 天前我遇到了这个问题:Concatenating mka files but keeping timestamp我使用 amix 修复了它,使用 start_pts 进行了延迟来自ffprobe。
今天我有一个像这样的新挑战,但有视频。
所以我有一堆 mkv 视频。每次有人加入聊天时,都会记录一个 mkv,但如果该人刷新页面,则会创建一个新的 mkv,其中 start_pts 和 start_time 与实际相同。此外,如果 session 开始并且有人在一分钟后加入,则 start_time 设置为 1 分钟。我需要合并所有这些 mkv 并在没有提要时用空白屏幕填充它们。
就像上面的例子一样,如果一个人在一分钟后加入,第一分钟是一个空白屏幕。此外,如果参与者在 10 秒后离开并重新加入,那么这 10 秒将再次变为空白。
关于如何用 ffmpeg 做到这一点的任何想法?
文件的具体示例:

0PA84c5c3f412769b311d44b159941b2d22.mkv - start_pts: 742 start_time: 0.742000
2PA73d94e8cb0f41c3002fadd6c04b4a88f.mkv - start_pts: 30761 start_time: 30.761000
3PAcd35e470325618fa8a3fb8bb5a41403e.mkv - start_pts: 50940 start_time: 50.940000
4PAddccde7b8847ecc43d5e8643b7903dba.mkv - start_pts: 69243 start_time: 69.243000
最终文件将产生一个长度为 69.243000 的文件,前 0.742 秒是空白的,并且之间的间隙也应该是空白的。
到目前为止,我已经尝试过:ffmpeg -i 0PA84c5c3f412769b311d44b159941b2d22.mkv -i 2PA73d94e8cb0f41c3002fadd6c04b4a88f.mkv -i 3PAcd35e470325618fa8a3fb8bb5a41403e.mkv -i 4PAddccde7b8847ecc43d5e8643b7903dba.mkv -filter_complex "[0:v] [1:v] [2:v] [3:v] concat=n=4:v=1 [v]" -map "[v]" test.mkv这可行,但没有我提到的那些差距。

最佳答案

您可以使用 ffprobe 获取文件的长度并计算间隙的长度。
然后使用 color 创建这些间隙在视频之间过滤和连接它们。
这是命令:

ffmpeg -i 1.mkv -i 2.mkv -i 3.mkv -filter_complex"\
color=s=1280x720,trim=0:0.742[gap0];\
color=s=1208x720,trim=0:5[gap1];\
color=s=1208x720,trim=0:2[gap2];\
[gap0][0:v][gap1][1:v][gap2][2:v]concat=6:v=1 [v]"\
-map [v] out.mkv

关于video - 连接 mkv 文件,保持原始时间戳和间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63391553/

相关文章:

android - 在Titanium中获取YouTube视频列表

php - 将 2 张图片添加到具有持续时间的视频中?

c++ - 在 OpenCV 中将一个视频序列插入到另一个视频中

java - NoiseInk 中的透明背景 (Java)

video - CKEditor:允许视频嵌入代码

ios - 在 iOS 下检索电影编解码器?

ios - 在 iOS 上流式传输 RTSP 时接收 "End of file"

ffmpeg - 如何使用 FFMPEG 获取每个场景中间的屏幕截图

python - ffmpeg 无法以任何方式识别使用过的编解码器

ruby-on-rails - FFMPEG,如何在我方便的时候命名输出文件?