7

Кто-нибудь имеет представление о том, как я могу наложить маску изображения на видео, не меняя аудио и видео кодек?

Я делаю различные медиа-файлы для целей тестирования и хочу контролировать свои аудио и видео кодеки, используемые в A/V-контейнере, теперь мне нужно поместить маску изображения поверх A/V-файла без изменения аудио и видео кодека ,

При использовании ffmpeg -i video.avi -i image.png -filter_complex 'overlay' avi.mkv я могу добавить -acodec copy но не -vcodec copy , это выдает ошибку:

Streamcopy запрашивается для вывода streaam 0:0, который подается из сложного фильтра графа. Фильтрация и потоковое копирование не могут использоваться вместе.

И когда просто с помощью вышеуказанной команды FFmpeg кодирует мои потоки в другой формат (MPEG-4 и MP3)

2 ответа2

7

Вы ответили на свой вопрос: фильтры несовместимы с copy . Там вы используете видеофильтр, поэтому вы не можете использовать -vcodec copy или -c:v copy ; если вы используете аудиофильтр, вы не сможете использовать -acodec copy или -c:a copy .

copy , как следует из названия, копирует указанный поток без изменений. Фильтры изменяют поток (ы), на который они нацелены. copy и фильтры по определению несовместимы.

Если вы просто хотите выбрать определенный видеокодек, то это достаточно просто: use -c:v [codecname] ; вы можете увидеть список всех кодеков, которые поддерживает ваш ffmpeg

ffmpeg -codecs
0

В случае, если это кому-нибудь поможет, следует отметить, что, вероятно, есть несколько уродливый способ сделать то, что вы хотите, комбинируя ffprobe и ffmpeg с помощью bash. Если у вас установлен ffmpeg , скорее всего, у вас есть и ffprobe . В качестве простого примера только для аудио, следующее сработало для меня, хотя в принципе что-то подобное должно быть достижимо с несколькими потоками разных видов.

ffmpeg -i neil_young_tell_me_why.wav -af aresample=resampler=soxr:precision=33:cheby=true -ar 96000 -acodec `ffprobe -v error -show_entries:a:0 stream=codec_name -of default=noprint_wrappers=1:nokey=1 neil_young_tell_me_why.wav | xargs echo -n` neil_young_tell_me_why_96Kup.wav

Объяснение: Выходные данные команды ffprobe внутри обратных галочек расширяются на месте до потока 0 аудиокодека входного файла, а символ новой строки удаляется с помощью xargs . ffprobe был настроен на вывод минимального объема текста, а вывод "писателя" по умолчанию для ffprobe был настроен на удаление всего другого постороннего текста, такого как метки и т. д., при записи на экран.

Я хотел протестировать более качественную передискретизацию с помощью SoX поэтому я увеличил частоту дискретизации файла wav с 44,1 до 96 кГц, сохранив тот же кодек. Без этого кодек, автоматически выбираемый ffmpeg имел меньшую битовую глубину, в результате чего разрешение снижалось с 24 бит до 16 бит. Таким образом, не было потери точности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .