FFMPEG 符 工 关于 RTSP问题解答

本文档探讨了FFmpeg在处理RTSP流时遇到的问题,即视频数据发送完成后,由于rtsp连接未主动断开导致的死循环。为解决此问题,提出了在rtsp协议中加入超时机制,当一段时间未收到数据时退出。然而,这种方法可能不够精确,需要优化处理超时条件。文中还展示了相关代码修改,涉及avio.c、aviobuf.c、rtsp.c和rtspdec.c等文件,以实现更准确的结束播放判断。

 

问题原因:由于rtsp发送视频数据完成后,不会主动断开连接,
         rtp接收数据会一直receive again,导致死循环。
解决方案:在rtsp协议中加超时机制,一段时间没有收到数据,超时退出
存在问题:这样在没有收到数据做超时退出,可能导致退出不及时,不够
精确,需要优化处理(通过时常或文件大小,需要权衡)。
---
 .../av/LibPlayer/amffmpeg/libavformat/avio.c       | 32 ++++++++++++++--------
 .../av/LibPlayer/amffmpeg/libavformat/aviobuf.c    |  4 ++-
 .../av/LibPlayer/amffmpeg/libavformat/rtsp.c       |  7 +++--
 .../av/LibPlayer/amffmpeg/libavformat/rtspdec.c    |  1 +
 .../av/LibPlayer/amffmpeg/libavformat/url.h        |  1 +
 5 files changed, 30 insertions(+), 15 deletions(-)
 mode change 100644 => 100755 vendor/amlogic/frameworks/av/LibPlayer/amffmpeg/libavformat/avio.c
 mode change 100644 => 100755 vendor/amlogic/frameworks/av/LibPlayer/amffmpeg/libavformat/aviobuf.c
 mode change 100644 => 100755 vendor/amlogic/frameworks/av/LibPlayer/amffmpeg/libavformat/rtsp.c
 mode change 100644 => 100755 vendor/amlogic/frameworks/av/LibPlayer/amffmpeg/libavformat/rtspdec.c
 mode change 100644 => 100755 vendor/amlogic/frameworks/av/LibPlayer/amffmpeg/libavformat/url.h

 

参考之前写的文档 :  主要知道读调用过程: 

aviobuf.c  (avio_read) -> avio.c  (retry_transfer_wrapper) ->  rtsp.c (ff_rtsp_fetch_packet) 

主要思路是修改返回值为AVERROR_EOF 。 超时时间时候。 

 

 

 

 

 

关键点: ff_rtsp_fetch_packet  

 

 

 

 

 

 

 

 

 

 

 

 

^[[33mcommit 23eb7258ef0c3ed64e130060b0935a50a7f8b04b^[[m
Author: Fu bilong <fubilong@ws01.sen5.sz>
Date:   Fri May 25 17:18:07 2018 +0800

    [ffmpeg] 修改rtsp播放结束不能退出问题
 

 .../av/LibPlayer/amffmpeg/libavformat/avio.c       | 35 ++++----
 .../av/LibPlayer/amffmpeg/libavformat/aviobuf.c    |  4 +-
 .../av/LibPlayer/amffmpeg/libavformat/rtsp.c       | 13 +--
 .../av/LibPlayer/amffmpeg/libavformat/rtspdec.c    |  3 +-
 .../av/LibPlayer/amplayer/player/player.c     &nb

FFmpeg中,处理RTSP服务器响应的消息涉及到FFmpeg库的`avformat_network_parse()`函数,它主要用于解析HTTP/RTSP格式的网络请求。当FFmpeg发送一个RTSP命令(如PLAY, SETUP等)到服务器后,服务器会返回一个HTTP或RTSP响应,包含状态码(如200 OK表示成功,404 Not Found表示未找到),以及可能的数据,比如元数据或者错误信息。 以下是处理步骤: 1. **发送请求**:使用FFmpeg的`avformat_open_input()`创建一个RTSP上下文,并使用`avformat_network_init()`初始化网络连接。 2. **发送请求消息**:创建`AVFormatContext`实例的`AVFormatPacket`,设置消息头(如`AVIOContext`, `CSeq`, `URI`, 等),然后调用`av_interleaved_write_frame()`将消息写入网络。 3. **等待响应**:调用`av_read_frame()`从网络读取`AVPacket`。这将捕获服务器的回应,可能是单个的帧或者是一个完整的HTTP/RTSP响应。 4. **解析响应**:对于每个收到的`AVPacket`,调用`avformat_network_parse()`解析其内容,这个函数会检查状态码和消息头,提取出有用的信息。 5. **处理结果**:根据状态码判断是否成功,处理元数据(如有)并执行相应的操作,如调整播放速率、解析媒体描述等。 ```cpp // 示例代码片段 AVFormatContext *ctx = NULL; int ret; while ((ret = av_read_frame(ctx, &pkt)) >= 0) { if (pkt.stream_index == -1) { // 处理整个HTTP/RTSP响应 avformat_network_parse(...); } else { // 处理视频音频数据... } av_packet_unref(&pkt); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值