FFmpeg+iOS+有损蜂窝连接

FFmpeg+iOS+有损蜂窝连接,ios,ffmpeg,video-streaming,Ios,Ffmpeg,Video Streaming,我能够使用FFmpeg在iOS上播放RTMP音频+视频实时流。当一切都在可靠的WiFi连接上时,效果非常好 当我切换到蜂窝连接、高信号强度和LTE/4G时,av_read_帧将间歇性阻塞一段不可接受的时间。据我所知,并不是手机数据连接刚刚中断,因为我可以立即重新连接并开始下载更多数据包。在某些情况下,在它返回下一帧之前,我记录了30秒以上的挂起时间。当下一帧最终进入时,我的实时视频流被av_read_帧阻塞的时间永久延迟 如果函数返回时间超过1秒,我尝试使用AVIOInterruptCB中断回调

我能够使用FFmpeg在iOS上播放RTMP音频+视频实时流。当一切都在可靠的WiFi连接上时,效果非常好

当我切换到蜂窝连接、高信号强度和LTE/4G时,av_read_帧将间歇性阻塞一段不可接受的时间。据我所知,并不是手机数据连接刚刚中断,因为我可以立即重新连接并开始下载更多数据包。在某些情况下,在它返回下一帧之前,我记录了30秒以上的挂起时间。当下一帧最终进入时,我的实时视频流被av_read_帧阻塞的时间永久延迟

如果函数返回时间超过1秒,我尝试使用AVIOInterruptCB中断回调中止av_read_帧。下面是该代码的外观:

- (void)readPackets {
    // Make sure FFmpeg calls our interrupt periodically
    _context->interrupt_callback.callback = interrupt_cb;
    _context->interrupt_callback.opaque = self;

    dispatch_async(_readPacketQueue, ^(void) {
        int err;

        while(true) {
            _readFrameTimeStamp = [[NSDate date] timeIntervalSince1970];
            err = av_read_frame(_context, &packet);
            _readFrameTimeStamp = 0;

            if(err) {
                // Error - Reconnect the entire stream from scratch, taking 5-10 seconds
                // And we know when av_read_frame() was aborted
                // because its error code is -1414092869 ("EXIT")
            }
            else {
                // Play this audio or video packet
            }
        }
   });
}

/**
 * Interrupt
 * @return 1 to abort the current operation
 */
static int interrupt_cb(void *decoder) {
    if(decoder) {
        if(_readFrameTimeStamp != 0) {
            if([[NSDate date] timeIntervalSince1970] - _readFrameTimeStamp > 1) {
                // Abort av_read_frame(), it's taking longer than 1 second
                return 1;
            }
        }
    }
}
这肯定会在1秒后中止av_read_frame,但不幸的是,在我这样做之后,以后调用av_read_frame的尝试会导致EIO错误-5,这表示连接已断开

因此,我不得不完全重新连接查看器,这需要5-10秒。avformat_open_输入需要约3-4秒,然后再次查找流信息需要约2-3秒,然后开始读取帧

完全重新连接的5-10秒延迟要比等待av_read_帧解除阻塞的时间超过10秒要好得多,也比实时流被大量延迟要好得多。但这比立即重试av_read_frame要糟糕得多

从手机用户的角度来看,当我们从头开始在后台重新连接流时,他们的视频会间歇性锁定5-10秒,这不是一个好的用户体验

有哪些策略可以更好地管理有损蜂窝连接上的av_read_帧?
或者改进重新连接时间的策略?

我认为您需要转向自己处理网络I/O,并向avformat提供数据块。

我也有同样的问题。