美文网首页
FFmpeg丢包花屏处理

FFmpeg丢包花屏处理

作者: Goning | 来源:发表于2018-07-04 11:37 被阅读226次

花屏有很多种情况,大多数情况是由于网络传输丢包导致的,也有可能是解码错误导致的,也有可能是渲染有问题。

这里介绍下网络传输丢包的处理:
1、如果使用的是udp,那么可以尝试修改udp.c中的UDP_MAX_PKT_SIZE大小x10。
注:使用tcp:

AVDictionary *options = NULL;
av_dict_set(&options, "rtsp_transport", "tcp", 0);

2、修改rtpdec.c的源码,捕获丢包,比如当前packet存在丢包,那么将此帧丢掉,直到下一个关键帧,这样就不会因为丢包导致花屏,但会跳秒(卡顿)。

while (1) {
        AVPacket pkt;
        ret = av_read_frame(f->ctx, &pkt);
        if (pkt.nLostPackets) {
            // Do something.
        } else {
            // Do something
        }
    }

修改细节:
avformat.h中增加int av_read_frame_aozhen(AVFormatContext *s, AVPacket *pkt)函数:

// Add by zxn
int av_read_frame_aozhen(AVFormatContext *s, AVPacket *pkt);

utils.c中实现函数:

// Add by zxn
int av_read_frame_aozhen(AVFormatContext *s, AVPacket *pkt)
{
    return av_read_frame(s,pkt);
}

avcodec.h中的AVPacket结构体增加成员变量int nIsLostPackets:

// Add by zxn
// 1 is lost packets, 0 is not lost packets.
int nIsLostPackets;

avpacket.c中的av_init_packets函数中对其初始化:

// Add by zxn
pkt->nIsLostPackets       = 0;

utils.c中read_frame_internal函数增加临时变量int nIsLostPackets = 0,read_frame_internal函数调用ff_read_packet的后一句增加nIsLostPackets = cur_pkt.nIsLostPackets:

// Add by zxn
int nIsLostPackets = 0;
// Add by zxn
nIsLostPackets = cur_pkt.nIsLostPackets;

在函数末尾将nIsLostPackets赋值给pkt->nIsLostPackets:

// Add by zxn
if (nIsLostPackets)
{
    pkt->nIsLostPackets = nIsLostPackets;
}

rtpdec.c中的rtp_parse_queued_packet函数里面增加丢包判断的代码:

// Add by zxn
int nIsLostPackets = 0;
// Mod by zxn
// Add some code to check lost packets.
#if 0
    if (!has_next_packet(s))
        av_log(s->ic, AV_LOG_WARNING,
               "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);
#else
    if (!has_next_packet(s))
    {
        av_log(s->ic, AV_LOG_WARNING,
               "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);
        nIsLostPackets = 1; // lost packets
    }
#endif
//Add by zxn
if (nIsLostPackets)
{
    pkt->nIsLostPackets = nIsLostPackets;
}

参考:https://www.cnblogs.com/highway-9/p/5595101.html

相关文章

  • FFmpeg丢包花屏处理

    花屏有很多种情况,大多数情况是由于网络传输丢包导致的,也有可能是解码错误导致的,也有可能是渲染有问题。 这里介绍下...

  • 记录一次组播花屏问题的查找

    新开发的组播播放器,发现在视频源运动剧烈的时候会出现比较严重的花屏。开始以为是组播丢包导致的,但打印了丢包检测的日...

  • 系统架构设计笔记(96)—— 丢包处理策略

    丢包的常用处理方法有: 丢包重传和前向纠错。 1 丢包重传 丢包重传又叫后向纠错,也称为自动重传请求(ARQ),A...

  • live555 server tcp发送丢包问题调试

    今天在某个项目中发现,客户端通过tcp从live555 rtsp server取数据,居然也会遇到丢包花屏问题。由...

  • 弱网测试

    弱网环境存在的问题: 弱网环境下,出现丢包、延时软件的处理机制,最常见的问题就是丢包。 1、丢包: 在TCP协议中...

  • webrtc带宽预测---发送端预测

    SR RR 通过RR包,将丢包率信息回传给发送端,根据丢包率做发送端带宽估计。接收RTCP包,以及对应处理流程基本...

  • FFmpeg处理流程与命令

    FFmpeg处理音视频流程(记住)输入文件 --demuxer(解复用)--> 编码数据包 --decoder--...

  • FFmpeg视频转码学习

    由于最近公司的视频下载到iPhone XS Max本地视频出现花屏,但是经过FFmpeg转码之后一切正常,所以项目...

  • 播放器缓冲、同步策略

    1、缓冲策略 ffmpeg有自带缓存区,由于不对外暴露,无法很好的控制,经常出现播放花屏问题,当然我们可以修改源码...

  • 服务器网络故障处理——ping丢包或不通时链路测试说明

    服务器网络故障处理——ping丢包或不通时链路测试说明 前言 当客户端访问目标服务器出现 ping 丢包或 pin...

网友评论

      本文标题:FFmpeg丢包花屏处理

      本文链接:https://www.haomeiwen.com/subject/nhfeuftx.html