video - 使用 ffmpeg 和 xfade 过滤器合并多个视频文件
问题描述
我需要将多个视频文件(包含音频)合并到一个视频中。我注意到 xfade 最近发布并使用了它,但我遇到了音频同步问题。
所有视频的视频和音频格式/分辨率/成名和比特率/等都相同。
这是我用来合并 5 个不同持续时间的视频和 0.5 个交叉淡入淡出过渡的方法:
ffmpeg \
-i v0.mp4 \
-i v1.mp4 \
-i v2.mp4 \
-i v3.mp4 \
-i v4.mp4 \
-filter_complex \
"[0][1]xfade=transition=fade:duration=0.5:offset=3.5[V01]; \
[V01][2]xfade=transition=fade:duration=0.5:offset=32.75[V02]; \
[V02][3]xfade=transition=fade:duration=0.5:offset=67.75[V03]; \
[V03][4]xfade=transition=fade:duration=0.5:offset=98.75[video]; \
[0:a][1:a]acrossfade=d=0.5:c1=tri:c2=tri[A01]; \
[A01][2:a]acrossfade=d=0.5:c1=tri:c2=tri[A02]; \
[A02][3:a]acrossfade=d=0.5:c1=tri:c2=tri[A03]; \
[A03][4:a]acrossfade=d=0.5:c1=tri:c2=tri[audio]" \
-vsync 0 -map "[video]" -map "[audio]" out.mp4
上面的代码生成一个带音频的视频。第一段和第二段与音频对齐,但从第二个过渡开始,声音未对齐。
解决方案
您的偏移量不正确。尝试:
ffmpeg -i v0.mp4 -i v1.mp4 -i v2.mp4 -i v3.mp4 -i v4.mp4 -filter_complex \
"[0][1:v]xfade=transition=fade:duration=1:offset=3[vfade1]; \
[vfade1][2:v]xfade=transition=fade:duration=1:offset=10[vfade2]; \
[vfade2][3:v]xfade=transition=fade:duration=1:offset=21[vfade3]; \
[vfade3][4:v]xfade=transition=fade:duration=1:offset=25,format=yuv420p; \
[0:a][1:a]acrossfade=d=1[afade1]; \
[afade1][2:a]acrossfade=d=1[afade2]; \
[afade2][3:a]acrossfade=d=1[afade3]; \
[afade3][4:a]acrossfade=d=1" \
-movflags +faststart out.mp4
如何获取 xfadeoffset
值:
输入 | 输入持续时间 | + | 以前的 xfadeoffset |
- | xfadeduration |
offset = |
---|---|---|---|---|---|---|
v0.mp4 |
4 | + | 0 | - | 1 | 3 |
v1.mp4 |
8 | + | 3 | - | 1 | 10 |
v2.mp4 |
12 | + | 10 | - | 1 | 21 |
v3.mp4 |
5 | + | 21 | - | 1 | 25 |
这些是简化的示例持续时间,与原始问题中显示的持续时间不同。
- 有关详细信息,请参阅xfade和crossfade过滤器文档。
- 有关过渡效果库和更多示例,请参见FFmpeg Wiki:xfade。
- 您可以使用 获取输入持续时间
ffprobe
。
推荐阅读
- html - AngularJS - 来自动态生成的 JSON 的表,具有各种键名
- php - Trying to get mysqli_fetch_assoc working with bind_param
- python - makemessages 命令导致 html.py 文件和 UnicodeDecodeError
- python - converting the column's data type object to float in pandas using python
- javascript - 根据1-9和az显示数组的顺序
- php - PDO comma separated array search only returning results for first item
- vue.js - 为什么这个属性的变化不会触发 Vuejs 中的 watch?
- javascript - Show alert when link clicked
- angular - Ionic 3 facebook login
- linux - ext4 将文件复制到目录而不更改目录时间戳