Вопрос или проблема
У меня есть видеофайл в формате 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 и выбрать все нужные потоки субтитров, что делает этот инструмент мощным решением для обработки мультимедийных файлов.