Как предотвратить тупик при использовании именованных каналов? - PullRequest
2 голосов
/ 02 ноября 2011

У меня есть процесс захвата, который записывает необработанные видео и аудио данные в файлы.Примерно так будет захватывать 100 кадров данных.

./capture -n 100 -f video_file -a audio_file

Предоставляя мне 768000 байт audio_file и 414720000 байт video_file.Кажется, они складываются, как и ожидалось:

  • 414720000 == 1920x1080 (пиксели / кадр) * 2 (байты / пиксель) * 100 (кадры)
  • 768000 == 48k (Гц)) * 2 (байты / семпл) * 2 канала * 100 (кадры) / 25 (кадры / с)

Затем, когда я кодирую эти данные, как

ffmpeg -i audio_file -i video_file out.flv

Я получаю воспроизводимое видео со звуком (на самом деле у меня намного больше информации в командной строке, но это важные части для целей этого вопроса)

Теперь я действительно хочупрямой эфир, а не файл, и я могу сделать это нормально только для видео с чем-то вроде этого:

./capture -f /dev/stdout | ffmpeg -i - udp://127.0.0.1:10000

Я получаю видеопоток без аудио трансляции на udp, и ясмог получить и воспроизвести поток в порядке.Но когда я хочу добавить аудио в изображение, у меня возникают некоторые проблемы ... Я думаю, что я не могу отправить их обоих на stdout, и я не могу использовать stderr, потому что процесс захвата уже говорит об этом.Поэтому я попытался сделать это с именованными каналами, как это:

mkfifo audio_pipe
mkfifo video_pipe
ffmpeg -i audio_pipe -i video_pipe out.flv &
./capture -f video_pipe -a audio_pipe

Но это не работает, кажется, что все тупики.Я протестировал только запуск ./capture -f video_file -a audio_file, а затем открытие двух новых оболочек и выполнение cat video_file > /dev/null и cat audio_file > /dev/null, когда обе кошки запускаются, это разблокирует процесс захвата, поэтому, похоже, у него нет проблем с записью в каналы.Я взглянул на источник кода захвата, и он работает с обратным вызовом «кадр прибыл» из более глубокого API, который затем отправляет и записывает видеокадр и аудиоданные в указанном порядке (это блокировка).Я не знаю, что делает ffmpeg, читает ли он входной видеофайл или аудио файл последовательно, в любом порядке, или читает их одновременно в потоках.Я попытался изменить порядок на ffmpeg -i video_pipe -i audio_pipe out.flv, но, к сожалению, все по-прежнему блокируется.Использование только одного именованного канала для видеоданных работает нормально.

Как мне решить мою проблему?Я напишу его с помощью модуля подпроцесса python, как только пойму, как лучше всего избежать проблемы с блокировкой.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

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

1 голос
/ 02 ноября 2011

В Linux размер буфера канала ограничен 65 КБ, возможно, вы оказались в тупике, когда захват не будет записывать больше звука, пока не сможет записать больше видео, и ffmpeg не будет читать больше видео, пока не получитбольше аудио

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...