我最近开始了一个项目,该项目依赖于将 FLV 直接流式传输到 iOS 设备。作为最著名的我使用了 ffmpeg(和一个 iOS 包装器 - kxmovie)。令我惊讶的是,iPhone 4 甚至无法播放标清低比特率 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