Я безуспешно пытался объединить некоторые файлы mp4 с разной частотой кадров. Когда я объединяю файлы, всегда возникает проблема с выводом. В большинстве случаев звук не синхронизирован с видео. Я попытался изменить частоту кадров видео (с 30 на 60 или с 60 на 30), но это слишком сильно снижает качество.
Чтобы объединить файлы, я использовал все решения в этом посте .
при попытке этого метода:
:: Create File List
echo file file1.mp4 > mylist.txt
echo file file2.mp4 >> mylist.txt
echo file file3.mp4 >> mylist.txt
:: Concatenate Files
ffmpeg -f concat -i mylist.txt -c copy output.mp4
Звук и видео больше не синхронизируются, а видео иногда зависает.
При попытке «mp4 в mpg, а затем слить»:
ffmpeg -i 1.mp4 -qscale 0 1.mpg
ffmpeg -i 2.mp4 -qscale 0 2.mpg
cat 1.mpg 2.mpg | ffmpeg -f mpeg -i - -qscale 0 -vcodec mpeg4 output.mp4
Я теряю звук в файлах со скоростью 60 кадров в секунду, в этот момент я подумал, что это проблема со звуком, поэтому я попытался «унифицировать» аудиокодек всех файлов mp4 следующим образом:
ffmpeg -i input.mp4 -acodec SOME_AUDIO_TYPE -vcodec copy out.mp4
слияние происходит без каких-либо ошибок, но звук по-прежнему не синхронизирован
Итак, в моей последней попытке я попытался изменить частоту кадров моих файлов следующим образом:
ffmpeg -y -i source.mp4 -r FPS -s RESOLUTION -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4
Но результат слишком сильно снижает качество.
Существует ffprobe двух файлов:
libavutil 55. 57.100 / 55. 57.100
libavcodec 57. 88.100 / 57. 88.100
libavformat 57. 70.100 / 57. 70.100
libavdevice 57. 5.100 / 57. 5.100
libavfilter 6. 81.100 / 6. 81.100
libswscale 4. 5.100 / 4. 5.100
libswresample 2. 6.100 / 2. 6.100
libpostproc 54. 4.100 / 54. 4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.63.100
Duration: 00:00:32.00, start: 0.000000, bitrate: 3120 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-1), 1280x720, 2981 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s (default)
Metadata:
handler_name : SoundHandler
libavutil 55. 57.100 / 55. 57.100
libavcodec 57. 88.100 / 57. 88.100
libavformat 57. 70.100 / 57. 70.100
libavdevice 57. 5.100 / 57. 5.100
libavfilter 6. 81.100 / 6. 81.100
libswscale 4. 5.100 / 4. 5.100
libswresample 2. 6.100 / 2. 6.100
libpostproc 54. 4.100 / 54. 4.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.63.100
Duration: 00:00:23.01, start: 0.000000, bitrate: 2585 kb/s
Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720, 2412 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 159 kb/s (default)
Metadata:
handler_name : SoundHandler
При объединении двух файлов первым методом я получаю следующее:
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872466, current: 843279; changing to 2872467. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872467, current: 843535; changing to 2872468. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872468, current: 843791; changing to 2872469. This may result in incorrect timestamps in the output file.
[mp4 @ 0xbc5a340] Non-monotonous DTS in output stream 0:0; previous: 2872469, current: 844047; changing to 2872470. This may result in incorrect timestamps in the output file.
frame= 2340 fps=0.0 q=-1.0 Lsize= 19428kB time=00:00:50.53 bitrate=3149.8kbits/s speed=58.7x
video:18420kB audio:949kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.304418%
Есть ли решение этой проблемы?
Звук придется перекодировать с той же частотой дискретизации, если она отличается в разных файлах. Видео не нужно перекодировать, но оно должно иметь ту же временную шкалу.
ffmpeg -i input.mp4 -c:a aac -ar 48000 -ac 2 -c:v copy -video_track_timescale 600 out.mp4
Если звук файла уже является стерео AAC-LC 48 кГц, вы можете пропустить кодирование звука и просто использовать-c:a copy
Запустите concat с обработанными файлами.
Main
профиль для видео. Датчик pastebin показывает высокий уровень. Вы перекодировали видео?ffmpeg -i 1.mp4 -c:v copy output.mp4
(просто чтобы проверить файл), вывод поврежден (тот же вывод, что и gyazo). Я так понимаю ошибка в файлах? Я просто скачиваю их с twitch.tv, который я считаю надежным источником.В текущей папке конвертируйте все файлы mp4 в TS. Затем используйте команду Windows «копировать», чтобы объединить все TS. Затем, когда у вас есть один ts, трансмуксируйте в mp4 без перекодирования.
for %i in (*.mp4) do ffmpeg -i "%i" -c copy -bsf:v h264_mp4toannexb "%~ni.ts"
copy /b *.ts all.ts
ffmpeg -i all.ts -c copy all.mp4
Майкл Либман
ТайЛО
Логан
ffmpeg -i file1.mp4 -i file2.mp3 -i file3.mp4