Я ссылаюсь на эту тему здесь: Смешивание AVPackets в mp4-файл
Вопрос в основном такой же, как у меня, и первый ответ выглядит очень многообещающе.Исходный код (somkind of pseudo), который предоставляет пользователь pogorskiy , похоже, делает именно то, что мне нужно:
AVOutputFormat * outFmt = av_guess_format("mp4", NULL, NULL);
AVFormatContext *outFmtCtx = NULL;
avformat_alloc_output_context2(&outFmtCtx, outFmt, NULL, NULL);
AVStream * outStrm = av_new_stream(outFmtCtx, 0);
AVCodec * codec = NULL;
avcodec_get_context_defaults3(outStrm->codec, codec);
outStrm->codec->coder_type = AVMEDIA_TYPE_VIDEO;
///....
/// set some required value, such as
/// outStrm->codec->flags
/// outStrm->codec->sample_aspect_ratio
/// outStrm->disposition
/// outStrm->codec->codec_tag
/// outStrm->codec->bits_per_raw_sample
/// outStrm->codec->chroma_sample_location
/// outStrm->codec->codec_id
/// outStrm->codec->codec_tag
/// outStrm->codec->time_base
/// outStrm->codec->extradata
/// outStrm->codec->extradata_size
/// outStrm->codec->pix_fmt
/// outStrm->codec->width
/// outStrm->codec->height
/// outStrm->codec->sample_aspect_ratio
/// see ffmpeg.c for details
avio_open(&outFmtCtx->pb, outputFileName, AVIO_FLAG_WRITE);
avformat_write_header(outFmtCtx, NULL);
for (...)
{
av_write_frame(outFmtCtx, &pkt);
}
av_write_trailer(outFmtCtx);
avio_close(outFmtCtx->pb);
avformat_free_context(outFmtCtx);
Данные pkt , которые я получаю отсторонний API от моей камеры connectctec.Нет файла для открытия, для чтения входных данных, и нет потока RTSP, который будет получен с камеры.Это просто вызов API, который дает мне указатель на кодированный кадр H264, который является именно необработанными данными для AVPacket.
В любом случае, я пытаюсь использовать этот код в качестве основы для моего приложения, но первыйВозникающая проблема заключается в том, что я получаю ошибку времени выполнения:
Could not find tag for codec none in stream #0, codec not currently supported in container
Поэтому я начал добавлять дополнительную информацию в кодек, как погорский предложил:
outStrm->codec->codec_id = AV_CODEC_ID_H264;
outStrm->codec->width = 1920;
outStrm->codec->height = 1080;
Теперь, когда я предоставил codec_id, я надеялся, что сообщение во время выполнения изменится, по крайней мере, на что-то другое, но оно по-прежнему будет таким же:
Could not find tag for codec none in stream #0, codec not currently supported in container
Любая идея о том, как я могу настроить структуры,чтобы я мог открыть файл mp4 для записи своих пакетов в?