FFmpeg相机花图问题解决方法

一、问题现象

使用FFmpeg进行进行相机rtsp连接获取相机码流并解码在本地显示,这个过程中有遇见相机花图等问题,排查后发现有花图。正常情况下图像为

出现花图的情况时图像如下:

二、解决方法

1、设置相机参数--将影响网络传输和解码依赖性的参数都调低

拿海康相机为例:网页登陆相机192.168.1.252 输入默认用户名:admin密码:12345之后,登陆相机,选择“配置”->音视频 设置参数

将图像质量调到最低、帧率调低(25修改为12或8)、码率上限(最好为2MB以下)

2、修改rtsp连接方式

rtsp传输有以下几种方式:

UDP传输:Transport:RTP/AVP

TCP传输:Transport:RTP/AVP/TCP

RAW UDP传输:Transport:RAW/RAW/UDP

ffmpeg提供udp和tcp的支持

udp方法如下:

[cpp] view

plaincopy

AVDictionary* options = NULL;

av_dict_set(&options, "rtsp_transport","udp", 0);

avformat_open_input(&m_pRtspFmt, m_szRtspUrl, NULL, &options);

tcp方法如下:

[cpp] view

plaincopy

AVDictionary* options = NULL;

av_dict_set(&options, "rtsp_transport","tcp", 0);

avformat_open_input(&m_pRtspFmt, m_szRtspUrl, NULL, &options);

将连接修改为tcp连接 则能减少花屏,但会有一定程度上的卡顿。

3、增加udp连接方式缓冲区减少丢包

打开ffmpeg源码(我的博客里有怎么编译源码http://blog..net/zhouyongku/article/details/44961447)udp.c,可以做这样的实验

在方法2用udp传输的情况下 将udp.c中的UDP_MAX_PKT_SIZE 缩小10倍,再将编译好的ffmpeg库拿来用,则会发现花屏更加剧烈。于是将UDP_MAX_PKT_SIZE放大10倍,则基本上很难再出现花屏现象。

[cpp] view

plaincopy

#define UDP_TX_BUF_SIZE 32768

#define UDP_MAX_PKT_SIZE (65536*10)

#define UDP_HEADER_SIZE 8

4、多线程处理

测试过av_read_frame的耗时-发现在25帧/秒 4M比特流的情况下,av_read_frame耗时30~40ms,而解码也需要10ms左右,这就决定了1秒以内难以完成读取视频和解码视频的操作,即便是缓冲也不行,因为平均时间=25*(30~40+10)>1000ms。所以需要将读取rtsp码流作为一个线程,解码作为一个线程。下面是我封装好的存储rtsp线程码流的类

[cpp] view

plaincopy

/*******************************************************************

* @版权信息:

* @文件名称:PacketList.h

* @摘    要:AVPacket列表管理类

* @作    者:周勇

* @当前版本:1.0.0

* @日    期:2015年4月2日

* @备    注:动态内存加载和释放

*******************************************************************/

#include "Common.h"

classCPacketList

{

public:

CPacketList();

~CPacketList();

public:

BOOLInputPacket(AVPacket *pktIn);

AVPacketList* GetPacket();

voidFreeAllPacket();

protected:

AVPacketList        *m_pHead;                                           //列表头

AVPacketList        *m_pLast;                                               //列表尾

UINTm_nItemCnt;//共有多少未读项

UINTm_nInputNum;

UINTm_nOutputNum;

CRITICAL_SECTION    m_cs;

};

[cpp] view

plaincopy

#include "PacketList.h"

CPacketList::CPacketList()

{

m_pHead = NULL;

m_pLast = NULL;

m_nItemCnt = 0;

m_nInputNum = 0;

m_nOutputNum = 0;

InitializeCriticalSection(&m_cs);

}

CPacketList::~CPacketList()

{

}

BOOLCPacketList::InputPacket(AVPacket *pktIn)

{

BOOLbRet = TRUE;

EnterCriticalSection(&m_cs);

if(m_nItemCnt <= PKT_QUE_SIZE)

{

AVPacketList *pList = newAVPacketList;

av_copy_packet(&pList->pkt, pktIn);

pList->next = NULL;

m_nItemCnt++;

if(NULL == m_pHead)

{

m_pHead = pList;

}

if(m_pLast)

{

m_pLast->next = pList;

}

m_pLast = pList;

m_nInputNum++;

}

else

{

//FreeAllPacket();

bRet = FALSE;

}

LeaveCriticalSection(&m_cs);

returnbRet;

}

AVPacketList* CPacketList::GetPacket( )

{

AVPacketList *pPkt = NULL;

intnPos = 0;

EnterCriticalSection(&m_cs);

if(m_nItemCnt&&m_pHead)

{

pPkt = m_pHead;

if(pPkt == m_pLast)

{

m_pLast = NULL;

}

m_pHead = pPkt->next;

m_nItemCnt--;

m_nOutputNum++;

}

LeaveCriticalSection(&m_cs);

returnpPkt;

}

voidCPacketList::FreeAllPacket()

{

EnterCriticalSection(&m_cs);

AVPacketList *pNext = NULL;

while(m_pHead)

{

pNext = m_pHead->next;

av_free_packet(&m_pHead->pkt);

deletem_pHead;

m_pHead = pNext;

}

m_pLast = NULL;

m_nItemCnt = 0;

LeaveCriticalSection(&m_cs);

}

用法:

[cpp] view

plaincopy

CPacketList                 m_pktList;

//读取rtsp码流线程

voidCIPCamera::ReadStream()

{

AVPacket pkt;

av_init_packet(&pkt);

if(0 == av_read_frame(m_pRtspFmt, &pkt))

{

if(m_nInViStreamIdx == pkt.stream_index)

{

//将读取到的视频包存入队列

if(!m_pktList.InputPacket(&pkt))

{

LOG(LOG_ERROR, "Channel[0x%x]CIPCamera::RreadStream to inputpacket failed of buffer buff!",this, m_nChannelID);

}

}

}

av_free_packet(&pkt);

}

//从视频包队列中取包进行解码

voidCIPCamera::DecodeStream()

{

AVPacketList *pList = NULL;

AVPacket        *pPkt = NULL;

pList = m_pktList.GetPacket();

if(pList)

{

pPkt = &pList->pkt;

//读取到的是视频包

if(m_nInViStreamIdx == pPkt->stream_index)

{

//解码

if(DecodePacket(pPkt, m_pavfrm))

{

SendToUser();

}

}

//释放packet

av_free_packet(pPkt);

//释放list

deletepList;

}

}

转自:http://blog..net/zhouyongku/article/details/44979159

ffmpeg 切片花屏_FFmpeg相机花屏花图问题解决方法相关推荐

  1. ffmpeg 切片花屏_FFmpeg相机花屏花图问题解决方法-Go语言中文社区

    FFmpeg相机花图问题解决方法 一.问题现象 使用FFmpeg进行进行相机rtsp连接获取相机码流并解码在本地显示,这个过程中有遇见相机花图等问题,排查后发现有花图.正常情况下图像为 出现花图的情况 ...

  2. dnf正在连接服务器 黑屏,DNF卡登陆卡黑屏怎么办 更新跨区后各BUG问题解决方法分享...

    今日我们怀着激动的心情,在10点登陆了游戏(跨5),发现跨区并未更新,频道比原来还少了许多,登陆还出现卡登陆和卡黑屏. 故障分析: 经过多次尝试,我们发现本次全服跨区更新,游戏客户端和服务器配置文件改 ...

  3. win10 系统屏幕黑屏只有鼠标光标在动,问题解决

    win10 系统屏幕黑屏只有鼠标光标在动,问题解决 方法1 同时按Ctrl+alt+delete,--->详细信息---->任务管理器---->文件(左上角)---->运行新任 ...

  4. ffmpeg rtmp 花屏_iphone6splus花屏闪屏,iphone6sp换屏价格

    人们之所以会购买iPhone,大多数用户是因为它有非常高清的屏幕.一个高清的屏幕,不仅对大家的视力损害小,而且会有一个非常好的使用体验.但是手机一旦出现屏幕跳屏.花屏竖条的情况,会极大的影响人们对手机 ...

  5. mediarecorder自制录相机花屏问题 微信录制视频花屏

    自制相机录相会花屏 //预览时候执行的程序mCamera = Camera.open();mCamera.setPreviewDisplay(holder);mCamera.setDisplayOri ...

  6. 在电脑上显示未知发布者怎么办_笔记本电脑显示器花屏怎么办?电脑屏幕花屏的解决方法...

    笔记本电脑显示器花屏怎么办?笔记本电脑屏幕花屏该如何解决呢?近日有用户反映在使用笔记本电脑时候,会出现花屏的问题,下面就给大家介绍具体解决方法. 一:检查显示器与显卡的连线是否松动 若显示屏花屏的话, ...

  7. 惠普计算机开机半花屏,惠普笔记本闪屏_惠普笔记本闪屏黑屏花屏现象,如何解决...

    惠普笔记本偶尔闪屏 控制面板中打开"电源选项" 改完之后应用即可. 惠普笔记本老是闪屏怎么办啊 这个闪屏门和灯管有问题都可能.如果是14寸宽屏的就下个鲁大师看看屏幕是不是LG的 是 ...

  8. 达芬奇在AMD处理器的联想电脑上编辑视频时花屏、卡帧、闪烁的解决方法

    故障描述:达芬奇在使用AMD 4000系列移动端处理器的联想笔记本电脑上处理视频时出现了时间线花屏.修改时间线上的素材后播放时画面卡在两帧以内反复闪烁.画面闪烁黑帧的问题,重装软件.更换版本均无法有效 ...

  9. 荣耀linux笔记本开机白屏,笔记本开机白屏、花屏维修(一)

    笔记本开机白屏.花屏维修(一) 开机白屏,或者使用电脑的人都明白这个"白屏"的意思,但是也有少些使用电脑的人对这个白屏的了解认识不够,使用正常的电脑怎么会产生白屏呢?是屏的质量问题 ...

最新文章

  1. 云计算VDI相关职位招聘
  2. spyder画图窗口浮动
  3. 制作U盘启动LINUX安装(Ubuntu12.04)
  4. [Android] 使用Include布局+Fragment滑动切换屏幕
  5. 微擎css使用php变量,$_Wamp;全局变量
  6. 如何在IE地址栏显示自己的小图标
  7. 【资料】翘首期盼247天!《阿里巴巴Java开发手册》扫描插件详情介绍
  8. 解决jquery下checked取值问题...
  9. vscode配置python 控制台/终端/TERMINAL 不输出/不显示 解决办法
  10. [转载] Python杂记之 list.clear()方法,清空列表
  11. ORA-12170: TNS: 连接超时 问题
  12. linux上chrome、vlc等程序root不能运行的解决办法
  13. 化工企业ERP建设中设备管理的重要性
  14. 三菱PLC传送类指令应用
  15. Win7旗舰版如何激活超级管理员权限
  16. Spring Aop 5种通知写法及参数JoinPoint详解
  17. 11 wifi6速率_WiFi 6是什么?现在是更换WiFi 6路由器的时候吗?
  18. win32com处理excel数据透视表格式
  19. Rosalind Java| Counting Point Mutations
  20. CSS day_04(6.15)背景颜色图片、修饰元素、浮动

热门文章

  1. 玩英雄联盟说服务器不稳定,LOL官方:关于近期游戏稳定性问题的说明
  2. 如何下载及安装BIGEMAP GIS Office
  3. Cadence中器件镜像翻转的快捷键
  4. 苹果http视频点播技术
  5. 一个简单的SHELL脚本模板
  6. 正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443... 失败:拒绝连接。
  7. SecureCRT脚本(VBS)运行
  8. angular7+ngzorro响应式表单验证
  9. Linux下Redis服务启动与关闭
  10. 解决windows下安装cnpm后,cnmp不是内部命令的问题