Как объединить файлы MP4 с разными битрейтами?
Я хочу объединить два или три видео MP4 с видеокодеком MPEG-4 AVC и аудиокодеками MP3 (иногда MP3 Surround). И аудио, и видео могут иметь разный битрейт. Если это будет возможно, без транскодирования. Я уже пытался использовать FFmpeg, MP4Box и AviDemux, но безуспешно. Я ищу решение, которое может быть выполнено с использованием только командной строки.
Каждый фильм кодируется AviDemux с опцией двухпроходного.
Вот как я пытался сделать это с AviDemux:
avidemux --force-alt-h264 --load video1.mp4 --append video2.mp4 --output-format MP4 --save output.mp4 --quit
Там как с FFmpeg:
ffmpeg -y -f concat -i list.txt -c copy output.mp4
А как с MP4Box:
MP4Box -cat video1.mp4 -cat video2.mp4 -new output.mp4
Иногда это вообще не удавалось, но иногда это дало мне видео с хорошим воспроизведением первого файла, но второй файл был поврежден.
avprobe
Команда для двух файлов возвращает это:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ad.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
title : ad.mp4
encoder : Lavf52.78.3
Duration: 00:00:03.28, start: 0.000000, bitrate: 446 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 312 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: mp3, 48000 Hz, 2 channels, s16p, 126 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ad-chipmunkove.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
creation_time : 1970-01-01 00:00:00
title : ad-chipmunkove.mp4
encoder : Lavf52.78.3
Duration: 00:00:29.96, start: 0.000000, bitrate: 2946 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 2813 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: mp3, 48000 Hz, 2 channels, s16p, 127 kb/s
Metadata:
creation_time : 1970-01-01 00:00:00
И FFmpeg объединяет это:
[concat @ 0xb03ae40] Estimating duration from bitrate, this may be inaccurate
Input #0, concat, from 'list.txt':
Duration: 00:00:00.00, start: 0.000000, bitrate: 440 kb/s
Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 312 kb/s, 25 fps, 25 tbr, 25025 tbn, 50 tbc
Stream #0:1: Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 126 kb/s
Output #0, mp4, to 'output.mp4':
Metadata:
encoder : Lavf55.41.100
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 312 kb/s, 25 fps, 25025 tbn, 25025 tbc
Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 48000 Hz, stereo, 126 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 831 fps=0.0 q=-1.0 Lsize= 10961kB time=00:00:33.23 bitrate=2702.0kbits/s
video:10414kB audio:518kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.266208%
Вторая часть итогового видео выглядит так, но звук работает нормально.
1 ответ
Конкатенация файлов MP4, даже с разными битрейтами, должна работать. Это основное предположение об адаптивной потоковой передаче HTTP с использованием MPEG-DASH. Если конфигурация декодера точно такая же, она сохраняется как есть. Если не совсем то же самое (но совместимо), окно описания образца stsd
будет иметь несколько записей.
Для MP4Box это выглядит как ошибка. Я предлагаю вам подать проблему здесь со ссылками на некоторые примеры файлов.