Ответ 1
В ffmpeg
еще нет опции, чтобы автоматически извлекать все потоки в соответствующий контейнер, но это, безусловно, возможно сделать вручную. По умолчанию выбор потока выбирает только один поток для типа потока, поэтому вам нужно вручную сопоставить каждый поток.
1. Получить входную информацию
Используя ffmpeg
или ffprobe
, вы можете получить информацию в каждом отдельном потоке, и есть широкий диапазон форматов (xml, json, cvs и т.д.), доступных в соответствии с вашими потребностями.
ffmpeg
пример
ffmpeg -i input.mkv
Получаемый результат (я вырезал некоторые дополнительные материалы, номера потоков и информацию о формате - это то, что важно):
Input #0, matroska,webm, from 'input.mkv':
Metadata:
Duration: 00:00:05.00, start: 0.000000, bitrate: 106 kb/s
Stream #0:0: Video: h264 (High 4:4:4 Predictive), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:2: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:3: Audio: vorbis, 44100 Hz, mono, fltp (default)
Stream #0:4: Subtitle: ass (default)
ffprobe
пример
ffprobe -v error -show_entries stream=index,codec_name,codec_type input.mkv
Результат:
[STREAM]
index=0
codec_name=h264
codec_type=video
[/STREAM]
[STREAM]
index=1
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=2
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=3
codec_name=vorbis
codec_type=audio
[/STREAM]
[STREAM]
index=4
codec_name=ass
codec_type=subtitle
[/STREAM]
2. Извлеките потоки
Используя информацию из одной из приведенных выше команд:
ffmpeg -i input.mkv \
-map 0:v -c copy video.mkv \
-map 0:a:0 -c copy audio0.oga \
-map 0:a:1 -c copy audio1.oga \
-map 0:a:2 -c copy audio2.oga \
-map 0:s -c copy subtitles.ass
В этом случае приведенный выше пример совпадает с:
ffmpeg -i input.mkv \
-map 0:0 -c copy video.mkv \
-map 0:1 -c copy audio0.oga \
-map 0:2 -c copy audio1.oga \
-map 0:3 -c copy audio2.oga \
-map 0:4 -c copy subtitles.ass
-
Я предпочитаю первый пример, потому что
input file index:stream specifier:stream index
более гибкий и эффективный; он также менее подвержен неправильному отображению. -
См. документацию по спецификаторам потока и
-map
вариант, чтобы полностью понять синтаксис. Дополнительная информация находится в ответе на видео и аудио FFmpeg mux (из другого видео) - проблема с отображением. -
В этих примерах будет stream copy (re-mux), поэтому повторное кодирование не произойдет.