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