Há algum tempo que estou tentando acertar isso, imaginando se alguém já se deparou com algo assim antes.
Estou tentando concatenar uma pasta com vários clipes de vídeo, alguns com som, alguns sem e fotos que foram convertidas em um vídeo de 10 segundos.
Os clipes que não têm áudio e fotos convertidas têm uma faixa mp3 silenciosa adicionada a eles. (Isso também é adicionado aos clipes com som)
O problema aparece quando uma das fotos ou clipes de vídeo convertidos sem áudio está presente e o áudio começa a ficar fora de sincronia levemente, pois você só percebe quando pode ver alguém falando.
O problema também acontece com uma pasta com apenas clipes de vídeo que tenham som se os clipes de vídeo com som não tiverem a faixa silenciosa adicionada também.
O que é estranho é que ao reproduzir o vídeo de saída e o áudio ficar fora de sincronia se você pular para onde ele sai de sincronia ele se consertará, mas ficará fora de sincronia se for reproduzido a partir do começar.
INFORMAÇÕES DA VERSÃO DO FFMPEG:
ffmpeg version 3.3.4-1~16.04.york0 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libavresample 3. 5. 0 / 3. 5. 0
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
Aqui está o script completo que estou usando abaixo:
cd videoClips
for i in $(ls);do
if [[ $i =~ .*\.zip ]];then
echo "ZIP"
y=${i%.*}
echo $y
mkdir tmp_$y
unzip $i -d tmp_$y
cd tmp_$y
for i in $(ls);do
if [[ $i =~ .*\.jpg$ ]];then
ffmpeg -loop 1 -i $i -c:v libx264 -c:a aac -vf scale=1280:-2 -r 30 -t 10 -pix_fmt yuv420p $i.mp4
#Add Silent Audio Track
ffmpeg -i $i.mp4 -i ../SilentAudio.mp3 -vcodec copy -shortest $i.AUDIO.mp4
#Remove files
rm -rf $i.mp4
rm -rf $i
fi
done
#Add check
for F in *.mp4 ; do
echo "CHECK -> $F"
result='ffprobe -i $F -show_streams 2>&1 | grep 'Stream #0:1''
echo "$result"
#if [[ $result =~ .*aac$ ]];then
if [[ $result == *"aac"* ]];then
echo "AUDIO FOUND"
ffmpeg -i $F -i ../SilentAudio.mp3 -vcodec copy -shortest $F.FIN.mp4
rm -rf $F
else
#echo "AUDIO NOT FOUND"
ffmpeg -i $F -i ../SilentAudio.mp3 -vcodec copy -shortest $F.FIN.mp4
rm -rf $F
fi
done
for F in *.mp4 ; do
ffmpeg -i $F -c copy -bsf:v h264_mp4toannexb -f mpegts $(echo $F | perl -pe 's/mp4$/ts/g');
done
ffmpeg -i "concat:$(ls -1v *.ts | perl -0pe 's/\n/|/g;s/\|$//g')" -qscale 0 -c copy -bsf:a aac_adtstoasc $y.mp4
cd ../
fi
done
Eu tenho a sensação de que isso poderia ter algo a ver com a taxa de bits de áudio? Ou possível, os timestamps. Também tentei adicionar o APAD, mas isso pareceu piorar o problema de sincronização.