iOS SDK avcodec_decode_video 优化

标签 ios performance sdk ffmpeg cpu-usage

我最近开始了一个依赖于将 FLV 直接流式传输到 iOS 设备的项目。最著名的是我使用了 ffmpeg(和一个 iOS 包装器 - kxmovie)。令我惊讶的是,iPhone 4 甚至无法播放 SD 低比特率 FLV 视频。我正在使用的当前实现是在 dispatch_async while 循环中解码视频/音频/子帧并将 YUV 帧数据复制到一个对象,其中该对象被解析为 3 个纹理 - Y/U/V(在 RGB 颜色的情况下)空间 - 只需解析数据)并在屏幕上呈现。经过多次试验和错误后,我决定终止整个渲染管道,只让 avcodec_decode_video2 函数运行。令人惊讶的是,FPS 没有提高,视频仍然无法播放。

我的问题是:如何提高 avcodec_decode_video2 的性能?

注意: 我已经尝试了一些商业应用程序,它们可以完美播放同一个文件,CPU 使用率不超过 50-60%。

该库基于 1.2 分支,这是构建参数:

'--arch=arm',
'--cpu=cortex-a8',
'--enable-pic',
"--extra-cflags='-arch armv7'",
"--extra-ldflags='-arch armv7'",
"--extra-cflags='-mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-quad'",
'--enable-neon',
'--enable-optimizations',
'--disable-debug',
'--disable-armv5te',
'--disable-armv6',
'--disable-armv6t2',
'--enable-small',
'--disable-ffmpeg',
'--disable-ffplay',
'--disable-ffserver',
'--disable-ffprobe',
'--disable-doc',
'--disable-bzlib',
'--target-os=darwin',
'--enable-cross-compile',
#'--enable-nonfree',
'--enable-gpl',
'--enable-version3',

根据 Instruments,以下函数每个占用大约 30% 的 CPU 使用率:

Running Time    Self        Symbol Name
37023.9ms   32.3%   13874,8                   ff_h264_decode_mb_cabac
34626.2ms   30.2%   9194,7                    loop_filter
29430.0ms   25.6%   173,8                     ff_h264_hl_decode_mb

最佳答案

事实证明,即使有 NEON 支持,FFmpeg 仍然在 CPU 上执行,因此它无法比这更快地解码。有些应用程序使用 ffmpeg 和 HW 解码器,我最好的猜测是它们会剥离 header 并将原始 h264 数据提供给 Apple 的 AssetReader。

关于iOS SDK avcodec_decode_video 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460704/

相关文章:

javascript - 如何加快jquery中行的计算

ios - 从 NSMutableArray 中检索对象

ios - 核心数据管理对象上下文保存

c++ - 仿函数与模板参数

ios - 我应该在哪里加载 UISwitch 的状态?

javascript - LinkedIn Javascript SDK 无法返回职位

iphone - 如何将 viewController 添加为 subview ?

iphone - 改变 uialertview 大小的问题

同一项目中两个目标的 iOS 今天小部件

ios - Apple iOS 配置门户中没有 'add certificate' 按钮