ffmpeg -f concat не читает список файлов из канала командной строки?

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

Я пытаюсь использовать ffmpeg -f concat. Это работает, когда я использую временный файл. Для аккуратности было бы лучше использовать список через пайп. Я видел примеры этого в старых интернет-постах. Разве это больше не работает, или я упускаю что-то очевидное? Вот скрипт, который иллюстрирует проблему – если вы запустите test.sh x, это сработает, создав временный файл. Если вы запустите test.sh, то ffmpeg не сработает. Как указано в комментарии к скрипту, я пробовал это с -safe 0 и -protocol_whiteflag "file,pipe,fd".

#!/bin/zsh

o=test.mp4
tmp=test.tmp

if [[ "$1" == "x" ]] ; then
    echo Временный файл $tmp...
    ls GX01000?.mp4 | perl -ne 'print "file $_"' > $tmp
    ffmpeg -hide_banner -y -f concat -i $tmp -c copy $o
else
    echo Пайп
    ls GX01000?.mp4 | perl -ne 'print "file $_"' | \
    ffmpeg -hide_banner -y -f concat -i - -c copy $o
    # эта команда с -safe 0 и -protocol_whitelist тоже не работает
#   ffmpeg -hide_banner -y -safe 0 -protocol_whitelist "file,pipe,fd" -f concat -i - -c copy $o
fi

Вот вывод из случая ошибки:

% ./test.sh
Пайп
[fd @ 0x6000015f0620] Протокол 'fd' не в белом списке 'crypto,data'!
[concat @ 0x12e7055f0] Невозможно открыть 'fd:GX010005.mp4'
[in#0 @ 0x6000002f0100] Ошибка при открытии ввода: Неверный аргумент
Ошибка при открытии входного файла -.
Ошибка при открытии входных файлов: Неверный аргумент

Спасибо!

Не сам пайп, но поскольку ваша цель – аккуратность, рассмотрите редирект файла в подпроцессе:

ffmpeg -hide_banner -y \
  -f concat \
  -i <(ls GX01000?.mp4 | perl -ne 'print "file $_"') \
  -c copy $o

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

Проблема, с которой вы столкнулись при использовании команды ffmpeg -f concat, возникла из-за того, что ffmpeg не принимает входные данные непосредственно из стандартного ввода в формате, необходимом для конкатенации. Рассмотрим, почему это происходит, и как можно решить вашу задачу без использования временных файлов, что соответствует вашему стремлению к аккуратности.

Понимание проблемы

Команда ffmpeg ожидает ввод в определённом формате при использовании параметра -f concat. Этот формат подразумевает наличие файла, который содержит список файлов, которые нужно объединить. При использовании стандартного ввода (-i -), ffmpeg пытается обработать данные как обычный медиа-файл, что не соответствует его ожиданиям для режима конкатенации.

Ошибка в вашем скрипте

Код, который вы представили во втором блоке с ffmpeg, вызывает ошибку из-за того, что ffmpeg не может открыть вводимый файл как файл с правильной структурой. Ошибка "Invalid argument" подразумевает, что переданные данные не могут быть обработаны корректно, так как ffmpeg не находит строку "file …" в корректном формате.

Решение через подстановку

Вместо использования пайпа, вы можете применить подстановку файлов в командной оболочке, что позволит избежать создания временных файлов и одновременно сохранить чистоту вашего кода. Это может быть сделано с помощью process substitution, поддерживаемого в некоторых оболочках, таких как bash или zsh.

Вот как может выглядеть ваш скрипт с использованием подстановки:

#!/bin/zsh

o=test.mp4

echo "Использование подстановки файлов"
ffmpeg -hide_banner -y \
  -f concat \
  -i <(ls GX01000?.mp4 | perl -ne 'print "file $_"') \
  -c copy $o

Почему это работает?

При использовании <(...), оболочка создает временный именованный файл, который ffmpeg может открыть и обработать как обычный файл. Это позволяет передать список файлов для конкатенации в формате, который ffmpeg ожидает, без необходимости ручного создания временного файла, как в вашем первоначальном примере.

Заключение

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

Если вам потребуется дополнительная информация или помощь по работе с ffmpeg, не стесняйтесь задавать вопросы.

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

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