Сохранение данных в кодировке H.264 в файл с помощью ffmpeg

У меня есть данные H264, поступающие от фреймграббера. Используя эти данные, я уже написал потоковый сервер RTP/H264 (используя live555) и клиент RTP/H264 (используя ffmpeg и live555).

Я хочу добавить новую функцию на свой сервер: напрямую сохранять закодированные данные H264 в файл (без перекодирования) в любом формате (avi, mp4, mkv и т. д.), что позволяет позже смотреть видео с помощью VLC.

Для клиента дисплея, в основном, я выполнил:

1) Сборка пакетов из данных H264 с помощью ffmpeg/av_new_packet()

2) Декодировать данные H264 ffmpeg/avcodec_decode_video2()

3) Отформатируйте декодированный кадр с помощью ffmpeg/sws_scale().

4) Дисплей

Может ли кто-нибудь быстро посоветовать мне функцию сохранения видеофайлов без декодирования/транскодирования данных и использования ffmpeg? Достаточно

1) Выберите выходной контекст (формат)

2) Сборка пакетов из данных H264 с помощью ffmpeg/av_new_packet()

3) Сохраните пакет, используя ffmpeg/av_(interleaved)_write_frame() (а также av_write_trailer() и av_write_header())?

?

Всем спасибо


person robosara    schedule 01.06.2012    source источник


Ответы (2)


Я сделал аналогичный; использовал ffmpeg для кодирования. Я нашел пример ремуксирования ffmpeg 1, и он у меня сработал. (Слишком поздно отвечать, но я надеюсь, что это поможет кому-то еще.)

person sinan    schedule 21.06.2017

Пожалуйста, просмотрите ffplay.c:

static int video_thread(void *arg)
{
...
ret = get_video_frame(is, frame, &pts_int, &pkt);
...
}

pkt — это необработанный пакет h264. сохранить pkt.data в файл в порядке.

fwrite(pkt.data, 1, pkt.size, pf );

если этот файл не воспроизводится mplayer, сначала добавьте:

unsigned char const start_code[4] = {0x00, 0x00, 0x00, 0x01};
fwrite(start_code, 4,1, pf );
person Tiger Shi    schedule 11.10.2012
comment
Вряд ли это ответ, вопрос о пакетировании, а не о записи в файл. - person Roman R.; 11.10.2012