Ввод ffmpeg с использованием именованных каналов

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

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

3 ответа

Решение

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

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

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

Вы можете использовать параметр командной строки *-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 секунды из входного файла (или канала).

Используйте 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);
Другие вопросы по тегам