Используя ffmpeg, как скопировать видео и несколько потоков субтитров в MKV и перекодировать несколько аудиопотоков в AC3?

Вопрос или проблема

У меня есть видеофайл в формате MKV. Мне нравится качество видео, но не нравится, что звук в формате FLAC, так как я решил, что он занимает слишком много места.

Это файл с двойным звуком — это аниме с японским и английским звуком — и в нем также есть несколько потоков субтитров.

Это команда, которую я использую:

ffmpeg -i "01.mkv" -c:v copy -c:a ac3 -c:s copy "test.mkv"

Однако она обрабатывает только первый звуковой и первый поток субтитров. Мне нужна помощь с опцией map для нескольких потоков.

Добавьте -map 0 после ввода, чтобы включить все потоки всех типов в вывод:

ffmpeg -i "01.mkv" -map 0 -c:v copy -c:a ac3 -c:s copy "test.mkv"

Вы также можете указать команде map, чтобы она включала только некоторые типы потоков.

-map 0:a скопирует все звуковые потоки, а -map 0:a:0 скопирует только первый звуковой поток.

Если у вас есть вход, который может или не может содержать поток данного типа, добавьте в конце ? (например, -map 0:a?).

Тип Совпадения
v Видео
V Видео, кроме прикрепленных изображений, миниатюр видео, обложек
a Звук
s Субтитры
d Данные
t Приложения

Я считаю, что вам необходимо указать сопоставление звуковых и субтитровых потоков, чтобы убедиться, что все из них копируются, а не только первый. Для этого вам нужно добавить -map 0:a? -map 0:s? -map 0:v перед вашим -c:v.

Это должно сделать вашу команду

ffmpeg -i "01.mkv" -map 0:a? -map 0:s? -map 0:v -c:v copy -c:a ac3 -c:s copy "test.mkv"

Команда map используется, чтобы указать, что вы определенно хотите, чтобы эти вещи были включены в вывод. -map 0:a:1 указывает копировать только звуковой поток номер 1, в то время как -map 0:a? фактически будет использовать подстановочный знак и скопирует все.

Просто используйте “-map 0 -scodec copy”, вместо того чтобы вручную указывать [v]идео, [a]удио и [s]убтитры со всеми этими опциями. Работает для меня.

Из документации:

Например, чтобы сопоставить ВСЕ потоки из первого входного файла в выход

ffmpeg -i INPUT -map 0 output

Команда, которую я использую для преобразования видео H.265 в H.264 (с сохранением звука и субтитров) выглядит так:

ffmpeg -i source.mkv -vcodec h264 -acodec copy -scodec copy -map 0 output.mkv

Попробуйте!

Код

ffmpeg -i "01.mkv" -map 0:a? -map 0:s? -map 0:v -c:v copy -c:a ac3 -c:s copy "test.mkv"

работает для меня только когда у меня есть один источник!
Если у меня есть видео в одном файле “01.mkv”
аудио в другом файле “02.ac3”
и 2 субтитра в другом файле “subs.mkv”
мне нужно сделать что-то вроде

ffmpeg -i "01.mkv" -i "02.ac3" -i "subs.mkv" -i "subs.mkv" -map 0:v -map 1:a -map 2:s:0 -map 3:s:1 -c:v copy -c:a copy -c:s copy "test.mkv"

В противном случае файл повреждается.
Обратите внимание, что “subs.mkv” указан в качестве входного файла 2 раза специально, потому что указание его 1 раз, а затем использование

-map 2:s:0 -map 2:s:1

повреждает файл!

Ответ или решение

Чтобы обработать видеофайл в формате MKV, сохранив качество видео и включив несколько потоков субтитров, а также перекодируя несколько аудиопотоков в формат AC3 с использованием FFmpeg, необходимо правильно использовать параметр -map для выбора нужных потоков. Рассмотрим процесс более детально.

1. Установка FFmpeg

Если вы еще не установили FFmpeg, это можно сделать с помощью пакетного менеджера в вашем дистрибутиве или скачать с официального сайта FFmpeg.

2. Использование команды FFmpeg

Для вашей задачи мы будем использовать команду, которая позволяет выбрать все потоки аудио и субтитров, а также сохранить видео в исходном качестве. Исходная команда, которую вы привели, выглядит следующим образом:

ffmpeg -i "01.mkv" -c:v copy -c:a ac3 -c:s copy "test.mkv"

Однако эта команда копирует только первый аудиопоток и первый поток субтитров. Чтобы включить все потоки, можно использовать следующее:

Команда для нескольких потоков

ffmpeg -i "01.mkv" -map 0:v -map 0:a -map 0:s -c:v copy -c:a ac3 -c:s copy "test.mkv"

3. Параметры команды

  • -map 0:v: выбирает все видеопотоки из первого входного файла (в вашем случае "01.mkv").
  • -map 0:a: выбирает все аудиопотоки. Если вам нужно указать только определенные трубы, использовать -map 0:a? позволяет выбрать только доступные, избегая возникновения ошибок.
  • -map 0:s: выбирает все субтитры. По аналогии, -map 0:s? позволит избежать проблем, если не все форматы присутствуют.

4. Перекодирование аудиопотоков в формат AC3

Для перекодирования аудиопотоков в формат AC3 используйте следующее:

ffmpeg -i "01.mkv" -map 0:v -map 0:a -map 0:s -c:v copy -c:a ac3 -c:s copy "test.mkv"

Если вы хотите выбрать только определенные аудиопотоки, вы можете указать их номер, например, -map 0:a:0 для первого и -map 0:a:1 для второго.

5. Примеры использования с несколькими файлами

Если у вас есть видео в одном файле, аудио в другом и несколько субтитров:

ffmpeg -i "01.mkv" -i "02.ac3" -i "subs.mkv" -map 0:v -map 1:a -map 2:s:0 -map 2:s:1 -c:v copy -c:a ac3 -c:s copy "output.mkv"

Эта команда корректно обработает видео из первого файла, использует аудиопоток из второго файла "02.ac3" и два потока субтитров из "subs.mkv".

Заключение

Использование параметров -map в FFmpeg позволяет гибко управлять потоками в выходном файле. Описанная команда дает вам возможность сохранить качество видео, перекодировать аудио в AC3 и выбрать все нужные потоки субтитров, что делает этот инструмент мощным решением для обработки мультимедийных файлов.

Оцените материал
Добавить комментарий

Капча загружается...