【问题标题】:Receiving "End of file" while streaming RTSP on iOS在 iOS 上流式传输 RTSP 时接收“文件结尾”
【发布时间】:2013-11-16 12:40:38
【问题描述】:

我正在使用 ffmpeg 库从本地网络中的 IP 摄像机流式传输 RTSP。流与代码一起工作正常。

唯一的问题是流似乎在一段时间后停止了。在进一步调试时,我发现我收到“文件结束”,这就是循环中断的原因。

while(!playerShouldStop)// && (av_read_frame(pFormatCtx, &pkt1)>=0))
    {
            int ret = av_read_frame(pFormatCtx, &pkt1);
            NSLog(@"av read frame returned = %s",av_err2str(ret));
            if(ret >= 0)
            {
                // process video
            }
            else 
               break;
    }

日志说

av 读取帧返回 = 文件结束

我下载了 Wireshark 来检查我收到了哪些 RTSP 数据包,但没有任何帮助。

首先在直播中接收到EOF是正常的(不应该结束)。

其次,一次又一次地调用 av_read_frame() 也无济于事,但是当我重新启动整个方法时(就在 avformat_open_input > ) 然后就可以了。只是流媒体不流畅,时不时会暂停。

【问题讨论】:

    标签: ios iphone objective-c ffmpeg video-streaming


    【解决方案1】:

    好的...当我使用 AVDictionary 选项打开流时,它似乎在没有 EOF 的情况下工作。

    AVDictionary *opts = 0;
    int ret = av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    
    // Open video file and read header information into pFormatCtx
            if (avformat_open_input(&pFormatCtx, filename, NULL, &opts) != 0)
            {
                NSLog(@"Error opening video file.");
                return;
            }
    
            av_dict_free(&opts);
    

    不过,对此的任何适当解释都会有所帮助。

    【讨论】:

    • 使用这样的字典指定使用tcp打开流,如果你不做这个条目ffmpeg将首先尝试使用UDP作为传输打开流,失败时它将尝试TCP .我的猜测是您看到的 EOF 来自第一次失败。
    • @MichelleCannon ..我在第一个 EOF 之后重新启动连接,但在我收到 EOF 之后仍然存在。并且连接在流式传输过程中失败。 (不像流媒体根本没有开始)
    • 好吧,您上面的所有代码都在强制 tcp over udp。您阅读的流可能适用于两种协议,但 UDP 有问题。
    • 我试过 2 个摄像头...都面临同样的问题..我还没有找到任何其他合理的解释
    • hmm...这很奇怪我在使用 tcp 时得到了 EOF...体验完全相反?
    猜你喜欢
    • 2016-09-29
    • 2020-06-05
    • 2013-06-25
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多