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;
}
}
...全文
1639 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的编码器质量不是很好,建议购买商业的编码库
内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型与算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性与合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性与全局寻优能力,适用于现代智能电网中的需求侧管理与能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计与仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率与调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑与算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性与鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控与经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性与不确定性,提升系统运行的稳定性与电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性与可靠性目标,并通过仿真平台验证了所提方法的有效性与优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发与教学实践;②为实现微电网功率稳定控制与经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证与方案优化。; 阅读建议:建议结合提供的Simulink模型与相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建与参数调优方法,并通过与传统PID或MPC控制策略的对比实验,深入理解其在动态响应与鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。

2,554

社区成员

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

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