Получить пакеты TS в буфер из libavformat

Я хотел бы захватить видео, сжать его и мультиплексировать как mpeg2 ts. Все это довольно просто с библиотеками ffmpeg, но то, что я хотел бы сделать, вместо того, чтобы записывать его в файл, — это захват ts-пакетов в буфер и использование этого потока другими способами. Есть ли простой способ сделать это?

Чтобы прямо сейчас записать закодированные кадры в файл, я использую av_interleaved_write_frame(oc, &pkt). OC — это выходной контекст с определенным именем файла и форматом. pkt — это AVPacket, содержащий сжатый кадр. av_interlaced_write_frame выполняет мультиплексирование и запись файла.

В конечном итоге я хотел бы добиться того, чтобы записать один и тот же поток ts в несколько файлов, а также запускать и останавливать запись разных файлов независимо друг от друга. Запуск нового мультиплексора для каждого потока кажется неэффективным, поскольку поток TS не должен нуждаться в каком-либо заголовке или правильном окончании для правильного воспроизведения (если то, что я прочитал, верно)

Я немного потерялся, пытаясь найти хорошие примеры в коде ffmpeg, а библиотеки не очень хорошо документированы. Любой вклад по этому вопросу приветствуется. Спасибо!


person Nioreh    schedule 14.05.2012    source источник


Ответы (1)


Наконец заработало. Один из способов сделать это — использовать avio_alloc_context для настройки обратного вызова, когда вы делаете с потоком то, что хотите. У этого парня есть хороший пример:

https://github.com/EvilTengil/kinect-streamer/blob/master/src/kstreamer/ffv1_depth_encoder.cpp

person Nioreh    schedule 31.05.2012
comment
репозиторий github по ссылке, которую вы разместили, исчез; если вы помните или у вас есть какой-то код, не могли бы вы опубликовать фактический пример кода? - person Alex I; 30.11.2012