【问题标题】:FFmpeg - RTCP BYE packetsFFmpeg - RTCP BYE 数据包
【发布时间】:2019-10-20 12:09:13
【问题描述】:

我正在做一些依赖于 Wi-Fi RAK5206 电子板的 C++ 项目。我正在使用 ffmpeg 库来获取视频和音频流,我遇到了可以启动和停止流四次的问题,但是当我想启动第五次时,我得到了错误。错误描述为Invalid data found when processing input,当我调用avformat_open_input函数时发生,我需要重新启动电子板,重新连接到Wi-Fi等。

我通过 Wireshark 应用程序发现 VLC 正在工作,并且在调用 TEARDOWN 时它正在发送一些 BYE 数据包。我想知道错误是否取决于他们,因为我没有从我的应用程序发送。如何进行设置以强制 ffmpeg 发送 BYE 数据包?

我在rtpenc.h 文件中找到了一些声明,当我想连接时设置并尝试了哪些选项,但显然没有成功。 我用于设置选项和打开输入的代码:

AVDictionary* stream_opts = 0;
av_dict_set(&stream_opts, "rtpflags", "send_bye", 0);
avformat_open_input(&format_ctx, url.c_str(), NULL, &stream_opts);

【问题讨论】:

    标签: c++ ffmpeg rtp rtcp


    【解决方案1】:

    确保您正在从您的应用程序调用此 av_write_trailer 函数。

    如果不是,请调试并检查。

    /* Write the trailer, if any. The trailer must be written before you
         * close the CodecContexts open when you wrote the header; otherwise
         * av_write_trailer() may try to use memory that was freed on
         * av_codec_close(). */
        av_write_trailer(oc);
    

    来自ffmpeg源码的函数调用流程代码sn-p:

        av_write_trailer -> 
        ....
        ret = s->oformat->write_trailer(s);
        } else {
            s->oformat->write_trailer(s);
        }
        ...
        .write_trailer  = rtp_write_trailer  -> 
        ...
        if (s1->pb && (s->flags & FF_RTP_FLAG_SEND_BYE))
           rtcp_send_sr(s1, ff_ntp_time(), 1)
    

    【讨论】:

    • 似乎function 用于将数据保存到文件但我没有写入文件的情况。我正在解码、转换为字节并在应用程序中进一步处理的那些视频/音频数据包。
    • 请您查看 ffmpeg 源代码以获取更多详细信息。
    【解决方案2】:

    解决了将标志 16(二进制:10000)添加到 AVFormatContext 对象标志的问题。

    formatCtx->flags = formatCtx->flags | 16;
    

    根据rtpenc.h

    #define FF_RTP_FLAG_SEND_BYE  16
    

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 2013-02-06
      • 1970-01-01
      • 2011-02-24
      • 2015-05-14
      • 2018-09-26
      • 1970-01-01
      • 2020-11-05
      • 2014-04-05
      相关资源
      最近更新 更多