LINUX.ORG.RU

FFMPEG


0

2

Привет Всем! Возникла задачка с помощью ffmpeg создать контейнер mkv и добавлять в него заранее сформированые кодеком H264 кадры. Проблема в том, что сформированный AVPacket с готовым кадром, который я указываю в поле data (естественно с указанием размера), в поток пишется, но файл не воспроизводит эти кадры.

mkv_status
mkv_write_encoded_h264(mkv_file *mkv, void *h264_frame, size_t bytes) {
	if(mkv == 0 || *mkv == 0 || h264_frame == 0 || bytes == 0) return -1;

	AVPacket packet;
    av_init_packet(&packet);
    packet.data = (uint8_t*)h264_frame;
    packet.size = bytes;
	packet.stream_index = (*mkv)->stream_context->streams[0]->index;
    packet.flags = AV_PKT_FLAG_KEY;
	packet.pts = (int64_t)((*mkv)->frames * 10);
	packet.dts = (*mkv)->frames;
	packet.pos = -1;

	//packet.duration = AV_NOPTS_VALUE;
	(*mkv)->codec_context->coded_frame->pts = packet.pts;

	int status = av_write_frame((*mkv)->stream_context, &packet);
    av_free_packet(&packet);

	if(status < 0) return -1;

	(*mkv)->frames++;
	return MKV_OK;
} 

Может у кого есть предположение, что я сделал не так? Или может какие туторы на эту тему? Документацию по библиотеке естественно я читаю ! )))

    packet.flags = AV_PKT_FLAG_KEY;
	packet.pts = (int64_t)((*mkv)->frames * 10);
	packet.dts = (*mkv)->frames;
	packet.pos = -1;

Это фигня. Конечно, такое не воспроизведется. Разберись, что такое pts, dts, time_base (разный для AVCodecContext и AVStream), key frame.

Пример: doc/examples/muxing.c, да и сам ffmpeg.c

	(*mkv)->codec_context->coded_frame->pts = packet.pts;

Выкинь. Лезть в чужие данные можно, только если это явно разрешено в документации.

fopen ★★
()
Ответ на: комментарий от fopen

А настройки кодека выходного потока делать идентичными тому чем закодированы кадры? Просто этих настроек я не знаю - мне передают только буфер с готовым сжатым кадром.

MehrunDagon
() автор топика
Ответ на: комментарий от fopen

С pts dts и прочими стампами разобрался - сейчас контейнер их сам проставляет - видео по времени проигрывания аналогичное. А вот сама картинка из квадратиков серых.

MehrunDagon
() автор топика
Ответ на: комментарий от MehrunDagon

Возможно, отсутствуют SPS/PPS заголовок стирима. Откуда берутся фреймы, что за енкодер? Обычно они передаются с первым фреймом в стриме, но может быть и не так.

ono
()
Ответ на: комментарий от ono

Фреймы берутся из RTSP потока H264. Сохраняются в файл сырыми данными (каждый фрейм в отдельный файл). Из файлов я их и беру.

MehrunDagon
() автор топика
Ответ на: комментарий от MehrunDagon

Да. Между avformat_new_stream и avformat_write_header ты должен заполнить AVCodecContext. Параметры требуй от поставщика, иначе придется анализировать кодированный поток.

fopen ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.