ffmpeg объединяет mp4 60 кадров в секунду и 30 кадров в секунду в один файл

Я безуспешно пытался объединить некоторые файлы 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 и вывод консоли (если это то, что вы используете).
Прежде всего, спасибо за попытку помочь мне решить эту проблему. Я отредактировал свой вопрос, как вы советовали, и включил большинство шагов, которые я пробовал. Надеюсь, это поможет вам понять потенциальные ошибки, которые я делаю.
Показать полный вывод консоли:ffmpeg -i file1.mp4 -i file2.mp3 -i file3.mp4

Ответы (2)

Звук придется перекодировать с той же частотой дискретизации, если она отличается в разных файлах. Видео не нужно перекодировать, но оно должно иметь ту же временную шкалу.

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 с обработанными файлами.

При применении этих изменений к файлу (44 кГц) искажаются первые секунды. Я все еще пытался объединить файлы, и VLC вылетает, когда начинается поврежденное видео. есть ffprobe файла до и после команды: pastebin.com/TPYt7NVf . Начало отрицательное, я действительно не знаю, что это значит, но это может быть подсказкой
Ваш ffprobe здесь показывает Mainпрофиль для видео. Датчик pastebin показывает высокий уровень. Вы перекодировали видео?
Извините, у меня есть много mp4, которые мне нужно объединить, я мог бы использовать другие, потому что я предположил, что единственными «переменными», которые имеют значение, были звук и частота кадров. Что есть о «основном» или «высоком», что вызывает проблему? потому что у меня может быть это при объединении других видео.
Они могут иметь разное количество систем отсчета.
Это действительно объясняет, почему видео искажается при изменении аудиокодека и временной шкалы?
Видео не искажается при изменении временной шкалы или аудиокодека. Если присоединяемые видеопотоки не имеют одинаковых параметров битового потока, то обычно проигрыватель выдает искаженный вывод. Шкала времени просто заботится о сохранении скорости визуальных эффектов.
Вот так выглядят первые секунды видео "out.mp4" gyazo.com/f596143d2a638242d3285dbb09ad8d72
Я думаю, что есть проблема с моими файлами, когда я делаю что-то подобное 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