我正在做一些依赖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);发布于 2019-10-21 04:54:22
确保从应用程序中调用此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源的函数调用流代码片段:
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)发布于 2019-10-29 16:38:04
解决了向AVFormatContext对象的标志添加标志16 (二进制: 10000)的问题。
formatCtx->flags = formatCtx->flags | 16;根据rtpenc.h的说法
#define FF_RTP_FLAG_SEND_BYE 16https://stackoverflow.com/questions/58472846
复制相似问题