--ffmpeg --如何获得视频的宽高==========

天神镜心 2010-08-18 02:43:45
最近在编码时一个flv视频,在解码过程中,视频的宽高为0,一般来说,在经过下面代码后就能得到视频的宽高:
	// 注册所有的的codec和视频文件格式
av_register_all();

// 分配视频解码器内存
video_decode_context = avcodec_alloc_context();

// 分配音频解码器内存
video_decode_context = avcodec_alloc_context();

// 分配视频编码器内存
video_encode_context = avcodec_alloc_context();

// 分配音频编码器内存
audio_encode_context = avcodec_alloc_context();

//
MMAGW_DEBUG(("Open video"));

// 视频打开
ret = av_routine.alloc_input_format_context(&input_format_context, input_filename);

if(ret < 0)
{
return ret;
}

MMAGW_DEBUG(("Retrieve stream information"));

// 查找流信息
ret = av_find_stream_info(input_format_context) ;
input_format_context->programs

if(ret < 0)
{
return ret;
}

MMAGW_DEBUG(("Find the %d channels") % input_format_context->nb_streams );
// 查找 视频 音频 流
for(int i = 0; i < input_format_context->nb_streams; i++)
{
if(input_format_context->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO)
{
video_stream_index = i;
}
else if (input_format_context->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
{
audio_stream_index = i;
}

}

// 若没有音频 & 视频
if(video_stream_index == -1 && audio_stream_index == -1)
{

MMAGW_DEBUG(("Do not have video stream and audio stream"));
return -1;
}

// 得到视频流编码上下文的指针
if( -1 != video_stream_index )
{
MMAGW_DEBUG(("Find the video stream %d") % video_stream_index);

// 视频解码内容
video_decode_context = input_format_context->streams[video_stream_index]->codec;

// 寻找视频流的解码器
video_decode = avcodec_find_decoder(video_decode_context->codec_id);

if(!video_decode)
{
MMAGW_DEBUG (("FFMPEG Can Not Decoder For %d "), % (int)video_decode_context->codec_id );
}

// 打开解码器
ret = avcodec_open(video_decode_context,video_decode);

if(0 != ret)
{
MMAGW_DEBUG (( "FFMPEG Can Not Open Video Decoder ." ));
}

printf("Image Size %ld * %ld \n",video_decode_context->width, video_decode_context->height);

printf(( "Frame Rate %lf \n"), (float)video_decode_context->time_base.den / (float)video_decode_context->time_base.num);
}


而这个flv视频,在此代码后得到的 宽高为0

只有在
len = avcodec_decode_video(video_decode_context, pFrameDec, &frameFinished, packet.data, packet.size);        


之后
printf(" video_decode_context->coded_height = %ld \n", video_decode_context->coded_height);  
printf(" video_decode_context->coded_width = %ld \n", video_decode_context->coded_width);




才能得到视频的真正宽高, 但 又不知如何设置编码的video_encode_context的宽高
因为设置视频宽高是在 avcodec_decode_video()之前做的,之后设置的话 程序运行会出现内存错误!

请知道的详情的朋友解释一下

感谢!



...全文
1847 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
好 我帮你顶下 虽然看不懂
天神镜心 2010-08-19
  • 打赏
  • 举报
回复
来个人 说个话 我好结贴的... 白给50分
天神镜心 2010-08-19
  • 打赏
  • 举报
回复
经过刻苦钻研 终于知道怎么回事了

原因就是 在
av_find_stream_info(input_format_context) ;

有信息

 avcodec_open(video_decode_context,video_decode);

就没了
天神镜心 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sinfiasong 的回复:]

来个人 说个话 我好结贴的... 白给50分

[/Quote]
感谢 请得到分后 还我25分
天神镜心 2010-08-18
  • 打赏
  • 举报
回复
沉了

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧