Ввод ffmpeg с использованием именованных каналов - PullRequest
6 голосов
/ 06 апреля 2011

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

У меня вопрос, в каком формате должны быть файлы, передаваемые в канал, и как вводить файлы в канал.

Ответы [ 3 ]

5 голосов
/ 07 мая 2011

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

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

Одно из решений, которое я могу придумать, - объявить, что в вашем именованном канале есть видео - поэтому ffmpeg будет непрерывно читать из него и сохранять или передавать его в потоковом режиме. Конечно, вашей C-программе потребуется сгенерировать и записать это видео в именованный канал ... Это не так сложно, как кажется! Вы можете конвертировать ваши изображения (вы не сказали нам, в каком они формате) в YUV и просто писать одно за другим в именованном канале (YUV-видео - это серия изображений YUV без заголовков - также вы можете легко конвертировать из BPM в YUV, просто проверьте запись в Википедии на YUV ). Тогда ffmpeg будет думать, что именованный канал содержит простой YUV-файл, так что вы можете, наконец, прочитать его и сделать с ним все, что захотите.

4 голосов
/ 08 июня 2011

Вы можете использовать параметр командной строки * -loop_input *:

ffmpeg -loop_input -re -timestamp now -f image2 -r 25 -sameq -i input.jpg -an -vcodec mpeg2video out.mp4

В вашем случае замените input.jpg на канал.Затем FFmpeg будет создавать новый кадр каждые 1/25 секунды из входного файла (или канала).

0 голосов
/ 01 сентября 2012

Используйте image2 с подстановочными именами файлов, предполагая, что эти изображения существуют в виде файлов, из документов ffmpeg:

for creating a video from the images in the file sequence ‘img-001.jpeg’, ‘img-002.jpeg’, ..., assuming an input frame rate of 10 frames per second:

ffmpeg -i 'img-%03d.jpeg' -r 10 out.mkv

т.е.

AVFormatContext *pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx,"img-%03d.jpeg",NULL,NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...