Я хочу объединить 2 видео с помощью ffmpeg. Я использую:
ffmpeg -i output1.mp4 -scodec copy -vbsf h264_mp4toannexb i0.ts
Но файл mp4, который я получаю, выглядит намного хуже, чем исходный файл.
Вот информация о обоих файлах
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output1.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isom
creation_time : 2013-06-13 15:40:36
Duration: 00:00:15.72, start: 0.000000, bitrate: 2053 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 1931 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 128 kb/s
Input #0, mpegts, from 'i0.ts':
Duration: 00:00:15.64, start: 1.400000, bitrate: 1382 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: Libav
Stream #0.0[0x100]: Video: mpeg2video (Main), yuv420p, 1280x720 [PAR 1:1 DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0.1[0x101](und): Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
Как я могу решить эту проблему?
output1.mp4
и один выходi0.ts
. Кодирование в выходной контейнер ts будет использоватьmpeg2video
кодировщик по умолчанию (по крайней мере, в вашей сборке), и в прошлый раз я проверял битрейт по умолчанию или настройку качества для этого кодировщика,-b:v 200k
которая в большинстве случаев является слишком низкой.output1.mp4
и т. Д.) Имеют одинаковые форматы, частоту кадров и размер кадра?Ответы:
Подумайте об использовании
concat
демультиплексора . Таким образом, вы можете избежать создания временных промежуточных файлов с потерями и пропустить дополнительный этап перекодирования.Примечание. Все входные данные должны иметь одинаковые типы потоков (одинаковые форматы, одинаковое время и т. Д.).
Создайте текстовый файл и включите пути и имена каждого файла для объединения (или «объединения»). Пример файла
input.txt
:Теперь вы можете использовать
concat
демультиплексор:Если у вас нет этой функции, то либо ваш ffmpeg слишком старый, либо вы используете «поддельный» ffmpeg из вилки libav.
Простые в использовании статические сборки доступны для Linux, OS X и Windows на странице загрузки FFmpeg , или вы можете следовать пошаговому руководству по компиляции ffmpeg .
Также см:
источник
Самый быстрый 1-лайнер будет:
источник
ffmpeg -safe 0 -f concat -i <(find . -type f -name '*' -printf "file '$PWD/%p'\n" | sort) -c copy output.mkv
(mkv принимает больше кодеков, чем mp4, но вы также можете попробовать это с mp4). Это-safe 0
для последних версий ffmpeg, жалующихся на небезопасное имя файла , и-type f
только для перечисления файлов. Я добавил| sort
сортировать файлы по алфавиту; потому чтоfind
читает их по порядку как сохраненные в файловой системе. Работает также для файлов с пробелами.