gpt4 book ai didi

c - 无法使用最新的 ffmpeg 库解码 mp4 文件 : av_decode_video2

转载 作者:行者123 更新时间:2023-11-30 15:20:25 24 4
gpt4 key购买 nike

我正在围绕最新的 ffmpeg 库编写包装器代码。我从本地系统提供 MP4 文件。我的问题是,当我使用 av_decode_video2() 时,我无法获取任何解码帧。返回值是负数。我使用了 av_read_frame() 它返回 0。我用谷歌搜索了我面临的问题,但没有在哪里可以找到正确的解释。请在这里给我见解。将伪代码粘贴到此处。

    av_init_packet(avpkt);
picture=av_frame_alloc();
pFrameRGB=av_frame_alloc();
codec = avcodec_find_decoder(CODEC_ID_H264);
c= avcodec_alloc_context3(codec)
avcodec_open2(decoderLibraryData->c, decoderLibraryData->codec, NULL)
FormatContext = avformat_alloc_context();
char *pUrl ="./1.MP4";

iRet = avformat_open_input(atContext, pUrl, pFmt, NULL);

if(FormatContext == NULL)
{
printf("could not assign any memory !!!!!!!!! \n");
}

avformat_find_stream_info(FormatContext, NULL);


while(av_read_frame(FormatContext,avpkt) >= 0)
{

len = avcodec_decode_video2(c, picture, &got_picture,avpkt);

printf("CODEC MANAGER len %d Frame decompressed %d \n",len,got_picture);

if (len <= 0)
{
return ERROR;
}
}
}



if(lastHeight != 0 && lastWidth != 0)
{
if(lastWidth != c->width || lastHeight != c->height )
{
av_free(buffer);
buffer = NULL;
lastWidth = c->width;
lastHeight = c->height;

}
}
else
{
lastWidth = c->width;
lastHeight = c->height;
}
decodeFlag = 1;
if(!buffer)
{
int numBytes;
v_mutex_lock(globalCodecLock);
switch(inPixFormat)
{
case RGB:


// Determine required buffer size and allocate buffer
numBytes=avpicture_get_size(PIX_FMT_RGB24, c->width, c->height);

buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
avpicture_fill((AVPicture *)pFrameRGB,buffer,PIX_FMT_RGB24,c->width, c->height);

if(cntxt)
sws_freeContext(cntxt);

cntxt = sws_getContext(c->width, c->height, c->pix_fmt,
c->width, c->height, PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);

break;

}
v_mutex_unlock(globalCodecLock);
if(cntxt == NULL)
{
printf("sws_getContext error\n");
return ERROR;
}
}

{
sws_scale(cntxt, picture->data, picture->linesize, 0, c->height, pFrameRGB->data, pFrameRGB->linesize);
if(rgbBuff)
{


if(c->width <= *width && c->height <= *height)
{
saveFrame(pFrameRGB, c->width, c->height, rgbBuff,inPixFormat);

*width = c->width;
*height = c->height;
rs = SUCCESS;
break;
}
else
{
rs = VA_LOWBUFFERSIZE;
}
}
else
{
rs = VA_LOWBUFFERSIZE;
}
}
if(width)
{
*width = c->width;
}
if(height)
{
*height = c->height;
}
if(rs == VA_LOWBUFFERSIZE)
{
break;
}

我得到的 av_read_frame 的返回值为 0,但 av_decode_video2 返回的值为负值。我在这里找不到任何线索。

最佳答案

确保您已调用

av_register_all();

avcodec_register_all();

在应用程序的开头。

而且问题似乎出在调用avformat_find_stream_info。使用以下代码进行测试:

    AVPacket avpkt;
av_init_packet(&avpkt);
AVFrame* picture = av_frame_alloc();
AVFrame* pFrameRGB = av_frame_alloc();

AVFormatContext* c2 = avformat_alloc_context();

char *pUrl = "C:/Sample Videos/20-06-34.MP4";
int video_stream_index = 0;

AVInputFormat* pFmt;
int iRet = avformat_open_input(&c2, pUrl, pFmt, NULL);

AVStream* stream = c2->streams[video_stream_index];


AVCodec* codec = avcodec_find_decoder(stream->codec->codec_id);
avcodec_open2(stream->codec, codec, NULL);

if (c2 == NULL)
{
printf("could not assign any memory !!!!!!!!! \n");
}

while (av_read_frame(c2, &avpkt) >= 0)
{

int got_picture;
int len = avcodec_decode_video2(stream->codec, picture, &got_picture, &avpkt);

printf("CODEC MANAGER len %d Frame decompressed %d \n", len, got_picture);

if (len <= 0)
{
return ERROR;
}
}

关于c - 无法使用最新的 ffmpeg 库解码 mp4 文件 : av_decode_video2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30026884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com