ffmpeg编码后视频速度不正确,质量也不好,求助,求助,求助,求助啊

fancycow 2011-12-05 08:50:19
对采集到得摄像头图像进行编码保存,发现得到的视频质量不好,而且速度不对。下面是关键代码。高手们看看,问:
1.编码器和AVPacket的pts设置对不对?
2.AVPacket的dts要设置吗?设为多少?
3.编码质量不好可不可以通过设置pStream->quality = m_nQuality调节?
下面是小弟做的:
首先,编码器类型是通过文件格式guess得到;
其次,下面是初始化AVStream编码器的函数:
AVStream *pStream = av_new_stream(pFormatContext, 0);
if( NULL == pStream )
return NULL;
AVCodecContext *pCodecContext = pStream->codec;

pCodecContext->codec_id = (CodecID)codec_id; //guess得到
pCodecContext->codec_type = CODEC_TYPE_VIDEO;
pCodecContext->bit_rate = (int)m_fBitRate; //固定设置为了1000000
pCodecContext->width = m_nWidth; //图像宽度:我这里是2048
pCodecContext->height = m_nHeight; //图像高度:我这里是1356
pCodecContext->time_base.den = 30; //这个不懂怎么设置,设为25或30以外的任何数值都
//会导致avcodec_open()调用失败,我就只好这么设置了
pCodecContext->time_base.num = 1; //以下设置都是参考的out_example.c
pCodecContext->gop_size = 12;
pCodecContext->pix_fmt = PIX_FMT_YUV420P;

if (pCodecContext->codec_id == CODEC_ID_MPEG2VIDEO)
pCodecContext->max_b_frames = 2;

if (pCodecContext->codec_id == CODEC_ID_MPEG1VIDEO)
pCodecContext->mb_decision=2;


if(!strcmp(pFormatContext->oformat->name, "mp4") || !strcmp(pFormatContext->oformat->name, "mov") ||
!strcmp(pFormatContext->oformat->name, "3gp"))
pCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
return pStream;

然后我进行了编码保存,其实也是参考out_example.c,只是速度老不对,自己改写了pts,dts实在不知道怎么填:
if (pFormatcontext->oformat->flags & AVFMT_RAWPICTURE) {
/* raw video case. The API will change slightly in the near
futur for that */
AVPacket pkt;
av_init_packet(&pkt);

pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= pVideoStream->index;
pkt.data= (uint8_t *)m_pYUVFrame;
pkt.size= sizeof(AVPicture);

ret = av_write_frame(pFormatcontext, &pkt);
}
else{
int out_size = avcodec_encode_video(pCodecContext, m_pOutBuf, m_nOutBufSize, m_pYUVFrame);
if (out_size > 0){
AVPacket pkt;
av_init_packet(&pkt);
//pkt.pts = av_rescale_q(pCodecContext->coded_frame->pts, pCodecContext->time_base,pVideoStream->time_base);//原来是这样的
pkt.pts = currTickCount - startTickCount;//我记录了每一帧来的时间和第一帧时间,将这个差值作为pts,
//不知道这样有什么问题吗?
if( pCodecContext->coded_frame->key_frame )
pkt.flags |= PKT_FLAG_KEY;

pkt.stream_index = pVideoStream->index;
pkt.data= m_pOutBuf;
pkt.size= out_size;

ret = av_write_frame(pFormatcontext, &pkt);
}else{
ret = 0;
}
}
...全文
1493 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
柳长街 2013-09-22
  • 打赏
  • 举报
回复
请问,楼主,我在使用ffmpeg编码的时候已经设置了帧率为25即 m_cctxt->time_base.den=1; m_cctxt->time_base.num=25 但编码之后发送给接收端进行解码之后,为什么接收端(海康硬件解码器)为什么认为帧率只有1或者2呢?并且显示还花瓶。 我用的是ffmpeg1.0.7版本进行编码的。我的qq:94643913
the_spawn 2012-09-06
  • 打赏
  • 举报
回复
请问你的摄像头数据是怎么获取的,又怎么和ffmpeg关联?output_example,我怎么没看出来原始的需要编码的数据是从哪里获取的,在哪里?
xxyyxx21 2012-06-28
  • 打赏
  • 举报
回复
请问你的问题解决了吗?我用pc104来采集720*576数据之后,播放的时候出现快进式的样式。但是采集500*400的时候播放正常,不知道哪里出现问题了?
Thomas082 2012-03-18
  • 打赏
  • 举报
回复
我想请教一下,CODEC_ID_MPEG1VIDEO这个编码器需要另外安装吗?
你configure时的参数是如何设置的?
谢谢
wangchao_81810463 2011-12-08
  • 打赏
  • 举报
回复
ffmpeg的编码器质量不是很好,建议购买商业的编码库

表示怀疑 我觉得 ffmpeg应该挺好用 只是我们不会用
帮顶 支持免费 呵呵
FrankieWang008 2011-12-08
  • 打赏
  • 举报
回复
会不会是帧率的问题?
fancycow 2011-12-06
  • 打赏
  • 举报
回复
哦,谢谢mstlq,
pCodecContext->time_base.den = 30;关于这个,我的摄像头采集到的图像帧率在7-8f/s左右,可是我设置的一致后avcodec_open会出错, 不知道这个是什么原因?
另外,我也想指定编码器,只是原来out_example.c的例子中OutputFormat是用guessformat()通过文件格式猜的,如果自己要指定编码器的话,OutputFormat这个对象的分配和初始化应该怎么做?
mstlq 2011-12-06
  • 打赏
  • 举报
回复
对不起,看错了,楼主是摄像头实时输入的数据啊,那么应该用楼主的算pts的方法,另外摄像头的帧率是多少?
pCodecContext->time_base.den = 30; //这个应该是摄像头的帧率
否则码率控制会不正常

建议换点比较强的编码格式,比方说pCodecContext->codec_id 那里设成H264
mstlq 2011-12-06
  • 打赏
  • 举报
回复
//我记录了每一帧来的时间和第一帧时间,将这个差值作为pts,
//不知道这样有什么问题吗?

有B帧的时候,解码时间不等于播放时间,就容易出问题了
fancycow 2011-12-05
  • 打赏
  • 举报
回复
我自己完善了将编码器的初始化又添加了一些,发现质量好点了,但是速度还是不对。求助,大家给看看
pCodecContext->qcompress = 0.5;


//pCodecContext->mb_qmin/mb_qmax;
pCodecContext->pre_me = 2;
// pCodecContext->rc_eq = TEX;
pCodecContext->lmin = 1;
pCodecContext->lmax = 5;
pCodecContext->qmin = 1;
pCodecContext->qmax = 5;
pCodecContext->qblur = 0.0;
pCodecContext->spatial_cplx_masking = 0.3;
pCodecContext->me_pre_cmp = 2;
pCodecContext->rc_qsquish = 1;
pCodecContext->b_quant_factor = 1.25;
pCodecContext->b_quant_offset = 1.25;
pCodecContext->i_quant_factor = 0.8;
pCodecContext->i_quant_offset = 0.0;
pCodecContext->rc_strategy = 2;
pCodecContext->b_frame_strategy = 0;
pCodecContext->luma_elim_threshold = 0;
pCodecContext->chroma_elim_threshold = 0;
pCodecContext->dct_algo = 0;
pCodecContext->lumi_masking = 0.0;
pCodecContext->dark_masking = 0.0;
fancycow 2011-12-05
  • 打赏
  • 举报
回复
这。。。。
如果只能用ffmpeg呢?
哪些参数设定对视频质量或者视频大小影响较大的?
CyberLogix 2011-12-05
  • 打赏
  • 举报
回复
ffmpeg的编码器质量不是很好,建议购买商业的编码库

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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