Некоторое время пытался сделать это правильно, задаваясь вопросом, сталкивался ли кто-нибудь с чем-то подобным раньше.
Я пытаюсь объединить папку с несколькими видеоклипами, некоторые со звуком, некоторые без и с фотографиями, которые были преобразованы в 10-секундное видео.
К клипам, в которых нет звука и преобразованных фотографий, добавлена тихая дорожка mp3. (Это также добавляется в клипы со звуком)
Эта проблема возникает, когда присутствует одна из конвертированных фотографий или видеоклипов без звука, и звук начинает очень медленно синхронизироваться, поскольку вы замечаете только то, что кто-то говорит.
Проблема также возникает с папкой, содержащей только видеоклипы со звуком, если для видеоклипов со звуком также не добавлена беззвучная дорожка.
Что странно, так это то, что при воспроизведении выходного видео и звука происходит несинхронизация, если вы переходите к тому месту, где оно впервые вышло из синхронизации, оно само исправляется, но затем снова не синхронизируется, если воспроизводится с самого начала.
FFMPEG VERSION INFO:
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
Вот полный скрипт, который я использую ниже:
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
У меня есть ощущение, что это может быть связано с аудио битрейтом? Или возможные метки времени. Также попытался добавить apad, но это, похоже, усугубило проблему синхронизации.