基于ijkplayer在FFMpeg 中增加丢包数显示功能

基于ijkplayer在FFMpeg 中增加丢包数显示功能

目的: 在我们目前的应用场景中,使用ijkplayer 来进行RTSP 的拉流解码播放。但是我们设备端在传输层中并没有部署RTCP 的控制协议实现,所以无法对数据传输的丢包数进行反向收集,那就需要APP端对数据长度进行校验。
方案:

  1. 因为我们使用RTSP 数据传输协议,在ijkplayer 中,数据处理完全是交由FFMpeg来进行的,对上层和ijkplayer的SDK 层而言,收到数据包是不透明的,所以我们需要对FFMpeg的源码进行修改。
    2.在源码中,RTSP 协议传输对应的数据传输相关方法位于文件夹libavformat/rtsp.c中,在read_packet方法中,我们可以看到RTSP协议对应的传输类型判断(UDP or TCP)
#if CONFIG_RTSP_DEMUXER
    case RTSP_LOWER_TRANSPORT_TCP:
        len = ff_rtsp_tcp_read_packet(s, rtsp_st, rt->recvbuf, RECVBUF_SIZE);
        break;
#endif
    case RTSP_LOWER_TRANSPORT_UDP:
    case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
        len = udp_read_packet(s, rtsp_st, rt->recvbuf, RECVBUF_SIZE, wait_end);
        if (len > 0 && (*rtsp_st)->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
            ff_rtp_check_and_send_back_rr((*rtsp_st)->transport_priv, (*rtsp_st)->rtp_handle, NULL, len);
        break;
    case RTSP_LOWER_TRANSPORT_CUSTOM:
        if (first_queue_st && rt->transport == RTSP_TRANSPORT_RTP &&
            wait_end && wait_end < av_gettime_relative())
            len = AVERROR(EAGAIN);
        else
            len = avio_read_partial(s->pb, rt->recvbuf, RECVBUF_SIZE);
        len = pick_stream(s, rtsp_st, rt->recvbuf, len);
        if (len > 0 && (*rtsp_st)->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
            ff_rtp_check_and_send_back_rr((*rtsp_st)->transport_priv, NULL, s->pb, len);
        break;
    }

而在RTSP 协议上,实时流的传输是通过RTP协议来完成的,所以我们可以看到其内部调用了ff_rtp_check_and_send_back_rr 用于检查数据和发送回调,跟踪该方法查看其实现。其中lost参数即代表着丢帧数显示。

  • 数据位于FFMpeg层中,需要通过构造对应的方法进行调用。查看libavformat.a 中对应的头文件暴露,发现仅在avformat.h中存在对外方法,将对应的方法增加到该文件中,提供给外部调用即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值