gpt4 book ai didi

ios - FFmpeg + iOS + 有损蜂窝连接

转载 作者:行者123 更新时间:2023-12-04 23:03:57 31 4
gpt4 key购买 nike

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

当我切换到蜂窝连接(信号强度大和 LTE/4G)时,av_read_frame()会间歇性地阻塞一段 Not Acceptable 时间。据我所知,蜂窝数据连接并不是刚刚断开,因为我可以立即重新连接并开始下载更多数据包。在某些情况下,在它返回下一帧之前,我已经计算了 30 多秒的挂起时间。当下一帧终于出现时,我的实时视频流被永久延迟了 av_read_frame()被封锁。

我尝试使用 AVIOInterruptCB 进行变通。中断回调以中止av_read_frame()如果函数返回时间超过 1 秒。这是该代码的样子:

- (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;
}
}
}
}

这肯定会中止 av_read_frame() 1 秒后,但不幸的是,在我这样做之后,以后会尝试调用 av_read_frame()结果 EIO错误(-5),表示连接已被切断。

结果,我被迫完全重新连接查看器,这需要 5-10 秒。 ( avformat_open_input() 需要约 3-4 秒,然后再次查找流信息需要约 2-3 秒,然后开始阅读帧)。

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

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

有什么策略可以更好地管理有损蜂窝连接上的 av_read_frame()?
(或改善重新连接时间的策略?)

最佳答案

我想您需要自己处理网络 I/O 并使用数据 block 提供 avformat。

关于ios - FFmpeg + iOS + 有损蜂窝连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26820331/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com