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