gpt4 book ai didi

javascript - FFmpeg:同时使用 xfade 和 crossfade 时音频不同步

转载 作者:行者123 更新时间:2023-12-04 22:54:51 29 4
gpt4 key购买 nike

我在使用 xfade 和 crossfade 将 12 个视频连接在一起并保留音频时遇到问题。当我忽略音频流并仅应用 xfade 过滤器时,视频编码就好了。否则,过渡会挂起,并且音频会提前开始。
这是我的 filter_complex:

[0:v][1:v]xfade=transition=pixelize:duration=0.5:offset=3.042[V1];
[0:a][1:a]acrossfade=d=0.5[A1];
[V1][2:v]xfade=transition=pixelize:duration=0.5:offset=6.084[V2];
[A1][2:a]acrossfade=d=0.5[A2];
[V2][3:v]xfade=transition=pixelize:duration=0.5:offset=9.108[V3];
[A2][3:a]acrossfade=d=0.5[A3];
[V3][4:v]xfade=transition=pixelize:duration=0.5:offset=23.619[V4];
[A3][4:a]acrossfade=d=0.5[A4];
[V4][5:v]xfade=transition=pixelize:duration=0.5:offset=38.13[V5];
[A4][5:a]acrossfade=d=0.5[A5];
[V5][6:v]xfade=transition=pixelize:duration=0.5:offset=52.641[V6];
[A5][6:a]acrossfade=d=0.5[A6];
[V6][7:v]xfade=transition=pixelize:duration=0.5:offset=67.152[V7];
[A6][7:a]acrossfade=d=0.5[A7];
[V7][8:v]xfade=transition=pixelize:duration=0.5:offset=70.176[V8];
[A7][8:a]acrossfade=d=0.5[A8];
[V8][9:v]xfade=transition=pixelize:duration=0.5:offset=84.687[V9];
[A8][9:a]acrossfade=d=0.5[A9];
[V9][10:v]xfade=transition=pixelize:duration=0.5:offset=99.198[V10];
[A9][10:a]acrossfade=d=0.5[A10];
[V10][11:v]xfade=transition=pixelize:duration=0.5:offset=113.709[video];
[A10][11:a]acrossfade=d=0.5[audio];
转换持续时间为 0.5 秒,输入长度为从 ffprobe 读取的(格式持续时间):
0: 3.542
1: 3.542
2: 3.524
3: 15.011
4: 15.011
5: 15.011
6: 15.011
7: 3.524
8: 15.011
9: 15.011
10: 15.011
11: 15.011
据我了解,xfade 滤镜的偏移量应该是视频时长加上之前的偏移量减去过渡时长,对吧?那么这里出了什么问题?
        3.542 - 0.5 = 3.042
3.042 + 3.542 - 0.5 = 6.084
6.084 + 3.524 - 0.5 = 9.108
...

最佳答案

谢谢你的帮助。
我发现,当我在两个单独的文件(mp4/m4a)中输出视频和音频流,然后将它们合并在一起时,一切都是同步的。但是为什么我不能在一个命令中处理它呢?
这是我目前基于@Баяр Гончикжапов 答案的解决方案。

#!/bin/bash
LST=($(ls -1 ./test/*.mp4))
TOT=${#LST[*]}
f="${LST[0]}"
DUR="$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$f")"
OFS=$(echo $DUR -0.5 | bc -l)
echo $f $DUR $OFS
INP=("-i" "$f")
FCT=1
PDV="[${FCT}v]"
FLV="[0:v][1:v]xfade=transition=pixelize:duration=0.5:offset=${OFS}${PDV}"
PDA="[0a]"
FLA="[0:a]apad,atrim=0:${DUR}${PDA};"
PDC="[01a]"
FLC="[0a][1a]acrossfade=d=0.5${PDC}"

for (( i=1; i<=$(( $TOT -2 )); i++ )); do
f="${LST[$i]}"
INP+=("-i" "$f")
DUR="$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$f")"
OFS=$(echo $OFS + $DUR -0.5 | bc -l)
echo $f $DUR $OFS

((FCT++))
FLV+=";${PDV}[${FCT}:v]xfade=transition=pixelize:duration=0.5:offset=${OFS}"
PDV="[${FCT}v]"
FLV+="${PDV}"

PDA="[${i}a]"
FLA+="[${i}:a]apad,atrim=0:${DUR}${PDA};"

FLC+=";${PDC}[${FCT}a]acrossfade=d=0.5"
PDC="[0${FCT}a]"
FLC+="${PDC}"
done
f="${LST[-1]}"
INP+=("-i" "$f")
DUR="$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$f")"
PDA="[${i}a]"
FLA+="[${i}:a]atrim=0:${DUR}${PDA};"
echo $f $DUR
echo $FLV
echo ""
echo $FLA
echo ""
echo $FLC
echo ""
ffmpeg "${INP[@]}" -filter_complex "$FLV" -map $PDV -c:v h264_nvenc -cq 20 -an -y output.mp4 -hide_banner
ffmpeg "${INP[@]}" -filter_complex "$FLA $FLC" -map $PDC -c:a aac -q:a 4 -y output.m4a -hide_banner
ffmpeg -y -hide_banner -i output.mp4 -i output.m4a -c copy final.mp4

关于javascript - FFmpeg:同时使用 xfade 和 crossfade 时音频不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64696381/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com