Я впервые пользуюсь ffmpeg и у меня возникают проблемы с инициализацией выходного файла для mxv muxing.
Я следовал описанию в середине этой страницы , но оно не работает.
Когда я вызываю функцию avformat_write_header (), она возвращает код ошибки -1094995529, что означает: при обработке ввода обнаружены неверные данные.
Когда я выделяю выходной контекст в формате mp4 (я использую в обоих случаях avformat_alloc_output_context2), я не получаю эту ошибку, и он успешно пишет заголовок.
Я пытался проанализировать код этого примера , но я не мог понять, в чем проблема (я также пробовал разные функции без результата).
Вот мой код:
const char *filename = "c:\\Users\\MPM\\Desktop\\test.mkv";
AVFormatContext *mkvVideo = NULL;
int ret = 0;
ret = avformat_alloc_output_context2(&mkvVideo, av_guess_format("matroska", "c:\\Users\\MPM\\Desktop\\test.mkv", NULL), "mkv", filename);
std::cout << "\n avformat_alloc_output_context2: " << ret<<"\n";
AVStream* video_stream = avformat_new_stream(mkvVideo, NULL);
video_stream->time_base.den = 25;
video_stream->time_base.num = 1;
video_stream->id = mkvVideo->nb_streams - 1;
video_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
video_stream->codecpar->codec_id = AV_CODEC_ID_H264;
video_stream->codecpar->bit_rate = 40000;
video_stream->codecpar->width = 1920;
video_stream->codecpar->height = 1080;
video_stream->codecpar->format = 0;
// AVCodec *video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
// AVCodecContext *codecCTx = NULL;
// codecCTx = avcodec_alloc_context3(video_codec);
// avcodec_get_context_defaults3(codecCTx, video_codec);
// ret = avcodec_parameters_to_context(codecCTx, video_stream->codecpar);
// std::cout << "\n avcodec_parameters_to_context: " << ret;
// codecCTx->framerate = { 25, 1 };
// codecCTx->gop_size = 12;
// codecCTx->pix_fmt = AV_PIX_FMT_YUV420;
// codecCTx->max_b_frames = 1;
// codecCTx->codec_tag = 1;
// codecCTx->codec_type = AVMEDIA_TYPE_VIDEO;
std::cout << std::endl;
av_dump_format(mkvVideo, 0, filename, 1);
ret = avio_open(&mkvVideo->pb, "c:\\Users\\MPM\\Desktop\\test.mp4", AVIO_FLAG_READ_WRITE);
std::cout << "\n avio open: " << ret;
ret = avformat_write_header(mkvVideo, NULL);
std::cout << "\n ret: " << ret;
if (ret < 0)
{
char buffer[50];
size_t bufsize = 50;
av_strerror(ret, buffer, bufsize);
std::cout << "\n error message: ";
for (int i = 0; i < bufsize; i++) std::cout << buffer[i];
exit(1);
}
Выводимые выходные данные о формате вывода (с помощью av_dump_format) следующие:
Output #0, matroska, to 'c:\Users\\MPM\\Desktop\\test.mkv':
Stream #0:0: Video: h264, yuv420p, 1920x1080, q=2-31, 40 kb/s, 25 tbn
Я думаю, что может быть две причины, по которым он не работает:
Для AVStream отсутствуют некоторые параметры
Формат вывода mkv нужно инициализировать по-разному
Так может кто-нибудь сказать мне, что я делаю неправильно?