在iOS平台上实现全功能视频处理 | 盛大微酷 赵志猛

Preview:

Citation preview

iOS上开发视音频处理

微酷首席架构师 赵志猛

iOS DevCamp

Produced by CSDN

Website: http://devcamp.csdn.net

Weibo: http://weibo.com/cmdnclub

Thursday, August 2, 12

2000-2006

2006-2011

2011.5.

关于我

Thursday, August 2, 12

内容

什么是视音频处理

移动端的视音频处理

IRISTM引擎

微酷

Thursday, August 2, 12

什么是视音频处理

视音频处理就是增强视音频内容的可观赏性

转码

剪辑

滤镜和特效

视频叠层

音轨处理

Thursday, August 2, 12

视频转码

Thursday, August 2, 12

视频转码

文件格式

RMVB、AVI、WMV、MPG、DIVX、XVID、MOV、FLV/F4V、MP4、3GP ……

Thursday, August 2, 12

视频转码

文件格式

RMVB、AVI、WMV、MPG、DIVX、XVID、MOV、FLV/F4V、MP4、3GP ……

帧率

30fps、25fps、24fps、15fps、10fps ……

Thursday, August 2, 12

视频转码

分辨率和码率

SD 4:3、HD 16:9、IMAX 2.2:1 ……

CIF 352x288、480x360、VGA 640x480、1280x720、1920x1080、4096x3072 ……

互联网:流畅、标清、高清、超清

Thursday, August 2, 12

产品 视频码率@分辨率3.5~5Mbps@3072p, 3~4.3Mbps@1080p, 2~2.9Mbps@720p, 0.8~1Mbps@480p,

0.5Mbps@360p

1Mbps@622p, 500Kbps@378p, 300Kbps@288p

2Mbps@720p, 500Kbps@360p, 300Kbps@256p

1500Kbps@576p, 600Kbps@480p, 300Kbps@320p, 180Kbps@240p

上行1.4Mbps,分发800Kbps@360p

上行2.8Mbps,分发2.8Mbps或800Kbps@480p

上行512Kbps,分发512Kbps@360p

Thursday, August 2, 12

视频转码

编码算法

MPEG-2

DivX

MPEG-4 Part 10 H.264/AVC

VP8

AVS

Thursday, August 2, 12

音频转码

采样率

8K

44.1K、48K、96K

量化

8-bit、16-bit、24-bit、32-bit

·

人类听力范围:20Hz~20KHz

Thursday, August 2, 12

音频转码

声道

Mono、Stereo、5.1

码率

20Kbps~128Kbps、192Kbps

编码算法

PCM、WMA、MP3、AAC、AMR ……

Thursday, August 2, 12

剪辑

剪裁

拼接

Thursday, August 2, 12

滤镜和特效

颜色处理

图像处理

模板特效

变形特效

视频变速

Thursday, August 2, 12

颜色处理之颜色空间

RGB vs YUV

Thursday, August 2, 12

颜色处理之LOMO

LOMO公司,俄罗斯圣彼得堡

列宁格勒光学机械联盟

Lomographische AG公司,奥地利

过渡饱和、失衡曝光、模糊等

Thursday, August 2, 12

颜色处理之LOMO

LOMO公司,俄罗斯圣彼得堡

列宁格勒光学机械联盟

Lomographische AG公司,奥地利

过渡饱和、失衡曝光、模糊等

Thursday, August 2, 12

颜色处理之黑白

Thursday, August 2, 12

图像处理之马赛克

平均值法

随机采样法

各种让信号缺失的方法……

Thursday, August 2, 12

图像处理之马赛克

平均值法

随机采样法

各种让信号缺失的方法……

Thursday, August 2, 12

图像处理之马赛克

平均值法

随机采样法

各种让信号缺失的方法……

去马赛克可能吗?

Thursday, August 2, 12

图像处理之马赛克

平均值法

随机采样法

各种让信号缺失的方法……

死心吧去马赛克可能吗?

Thursday, August 2, 12

SOBEL算子边缘提取

图像处理之素描

Thursday, August 2, 12

SOBEL算子边缘提取

图像处理之素描

Thursday, August 2, 12

图像处理之色键

RGB空间 f(r, g, b) -> alpha

蓝屏或绿屏

YUV空间 f(y, u, v) -> alpha

完整色域的处理

Alpha Blending

Thursday, August 2, 12

图像处理之MotionBlur

Thursday, August 2, 12

图像处理之MotionBlur

Thursday, August 2, 12

模板特效之爆炸

Thursday, August 2, 12

模板特效之爆炸

Thursday, August 2, 12

模板特效之相框

Thursday, August 2, 12

变形特效之扭曲

Thursday, August 2, 12

变形特效之大眼

Thursday, August 2, 12

变形特效之鱼眼

Thursday, August 2, 12

视频变速之快慢放

改变视频播放的时长

10s

5s

15s

源视频:

快放:

慢放:

Thursday, August 2, 12

视频变速之快慢放

Thursday, August 2, 12

视频变速之快慢放

Thursday, August 2, 12

视频叠层

视频轨的概念

多轨合成

Video A

Video BVideo C

Thursday, August 2, 12

视频叠层之画中画

Thursday, August 2, 12

视频叠层之AlphaBlending

快速Blend

cr_C = cr_A * alpha_A + cr_B * (1 - alpha_A)

正片叠底

alpha_C = alpha_A + alpha_B - alpha_A * alpha_B

cr_C = (cr_A * alpha_A + cr_B * alpha_B * (1 - alpha_A)) / alpha_C

Thursday, August 2, 12

音轨处理

替换

混音

变速变调

自动增益

降噪

Thursday, August 2, 12

移动端的视音频处理

Thursday, August 2, 12

移动端的视音频处理

目标

实时拍摄、文件导入剪辑、实时渲染和预览360p、15fps、主观画质不能明显失真、要省流量全平台可播放:MP4 + AAC + AVC

Thursday, August 2, 12

移动端的视音频处理

目标

实时拍摄、文件导入剪辑、实时渲染和预览360p、15fps、主观画质不能明显失真、要省流量全平台可播放:MP4 + AAC + AVC

问题和挑战

不同的操作系统不同的硬件平台

Thursday, August 2, 12

性能

Thursday, August 2, 12

性能

15fps:每帧66ms内要完成拍摄/解码、特效、实时预览、编码、文件IO所有工作

Thursday, August 2, 12

性能

15fps:每帧66ms内要完成拍摄/解码、特效、实时预览、编码、文件IO所有工作

拍摄

解码特效 编码

1 2 31 2 3

缓冲队列 缓冲队列

Thursday, August 2, 12

性能

15fps:每帧66ms内要完成拍摄/解码、特效、实时预览、编码、文件IO所有工作

编解码⼀一定要用硬件,ffmpeg的实时性不给力

拍摄

解码特效 编码

1 2 31 2 3

缓冲队列 缓冲队列

Thursday, August 2, 12

性能

Thursday, August 2, 12

性能

特效渲染⼀一定要用GPU,Neon或类似SIMD指令是不够给力的

Thursday, August 2, 12

性能

特效渲染⼀一定要用GPU,Neon或类似SIMD指令是不够给力的

要尽可能 大化pipeline的并行性能,编解码硬件、CPU、GPU三者都是可以并行的

Thursday, August 2, 12

性能

特效渲染⼀一定要用GPU,Neon或类似SIMD指令是不够给力的

要尽可能 大化pipeline的并行性能,编解码硬件、CPU、GPU三者都是可以并行的

资源要复用,要做VideoFramePool、AudioFramePool、ShaderPool、VideoTexturePool、EffectPool等等

Thursday, August 2, 12

动态帧率

Thursday, August 2, 12

动态帧率

移动设备拍摄⼀一定会出动态帧率

iOS5以前只能设置 大帧率

iOS5以后可以同时控制 大 小帧率

Thursday, August 2, 12

动态帧率

移动设备拍摄⼀一定会出动态帧率

iOS5以前只能设置 大帧率

iOS5以后可以同时控制 大 小帧率

处理时的丢帧机制也会导致动态帧率

如果处理流水线在某个环节卡住,就需要丢帧

Thursday, August 2, 12

动态帧率

移动设备拍摄⼀一定会出动态帧率

iOS5以前只能设置 大帧率

iOS5以后可以同时控制 大 小帧率

处理时的丢帧机制也会导致动态帧率

如果处理流水线在某个环节卡住,就需要丢帧

解码时无法根据数学公式准确计算 后⼀一的位置或时间,需要做预测

Thursday, August 2, 12

像素格式

Thursday, August 2, 12

像素格式

YUV 4:2:0

视频编解码多基于这种格式,将Y和UV分片存储

Thursday, August 2, 12

像素格式

YUV 4:2:0

视频编解码多基于这种格式,将Y和UV分片存储

Y U V

Thursday, August 2, 12

像素格式

YUV 4:2:0

视频编解码多基于这种格式,将Y和UV分片存储

RGBA

数据连续,但数据量大,而且解码后要做⼀一次YUV到RGB的颜色转换

Thursday, August 2, 12

OpenGL ES

Thursday, August 2, 12

OpenGL ES

texture要按2^n对齐,显存利用率低

640x480 -> 1024x512,YUV⼀一帧768KB,RGBA⼀一帧2MB

Thursday, August 2, 12

OpenGL ES

texture要按2^n对齐,显存利用率低

640x480 -> 1024x512,YUV⼀一帧768KB,RGBA⼀一帧2MB

YUV4:2:0像素格式的texture管理方法

Luminance的Y + Luminance_alpha的UV

Thursday, August 2, 12

OpenGL ES

texture要按2^n对齐,显存利用率低

640x480 -> 1024x512,YUV⼀一帧768KB,RGBA⼀一帧2MB

YUV4:2:0像素格式的texture管理方法

Luminance的Y + Luminance_alpha的UV

下行不能直接用texture,要用render buffer

Thursday, August 2, 12

视频编码

AVC BaselineProfile

AVC MainProfile

理论上要比Baseline质量高出30%

Android部分低端机不支持

iOS的硬编码与Baseline没什么质量区别

Thursday, August 2, 12

音频编码

iOS4以后不再支持AMR

Android2.3以前Native只能录AMR,不能录AAC,但可以播AAC

Thursday, August 2, 12

剪辑

Thursday, August 2, 12

剪辑

逐帧剪,要做好解码控制

Thursday, August 2, 12

剪辑

逐帧剪,要做好解码控制

拼接点如果做过渡,比较难控制

视频总长会变短

A B

Thursday, August 2, 12

剪辑

逐帧剪,要做好解码控制

拼接点如果做过渡,比较难控制

视频总长会变短

拼接点附近音频要CrossFade,防止硬切换的爆音

A B

Thursday, August 2, 12

剪辑

逐帧剪,要做好解码控制

拼接点如果做过渡,比较难控制

视频总长会变短

拼接点附近音频要CrossFade,防止硬切换的爆音

拼接不同分辨率与幅面比的视频时要做好适配

A B

Thursday, August 2, 12

分辨率不统⼀一

Thursday, August 2, 12

分辨率不统⼀一各种移动端输出各种分辨率

iOS5以前只能出HighQuality、VGA640x480、MediumQuality、LowQuality,5以后多了1280x720、1920x1080两种

Thursday, August 2, 12

分辨率不统⼀一各种移动端输出各种分辨率

iOS5以前只能出HighQuality、VGA640x480、MediumQuality、LowQuality,5以后多了1280x720、1920x1080两种

各种分辨率与幅面比的适配

完全拉伸,图像或变胖或变瘦按高或宽适配,面临填黑边、裁剪的问题牛掰的seam carving,算不过来

Thursday, August 2, 12

视频慢放

邻近帧采样会⼀一蹦⼀一蹦

相邻帧插值会有重影

运动估计加非线性插值的运算量非常大

10s

15s

输出输入帧映射示意

Thursday, August 2, 12

音轨处理

采集的单声道和音乐双声道的混音问题

大 小值的自动增益算法会失效

需要统计期望平均值然后做非线性增益

Thursday, August 2, 12

码率问题

Thursday, August 2, 12

码率问题

iOS拍摄的视频文件码率很高

即使是VGA640x480的分辨率,码率仍然在2~3Mbps,30秒就要耗掉10MB,赶上蓝光

Thursday, August 2, 12

码率问题

iOS拍摄的视频文件码率很高

即使是VGA640x480的分辨率,码率仍然在2~3Mbps,30秒就要耗掉10MB,赶上蓝光

码率的选择

对于移动3G而言:W x H x (3~6)bps

我们的实验结果:512Kbps@480x360

Thursday, August 2, 12

文件格式

3GP格式逐渐不被支持iOS生成的mp4文件metadata在 后,部分Android设备不能播,flash如果要播则需要完全加载完文件才行,所以 后要把metadata换到文件前面去

MOV 3GP(*) flv/f4v mp4(*)

iOS Native YES YES - YES

Android Native - YES YES YES

Flash - YES YES YES

HTML5 YES YES - YES

PlayerFormat

Thursday, August 2, 12

HOME键/锁屏

Thursday, August 2, 12

HOME键/锁屏

线程即刻会被挂起,内存资源可能会被回收

Thursday, August 2, 12

HOME键/锁屏

线程即刻会被挂起,内存资源可能会被回收

要立刻交还所有的硬件资源

摄像头、麦克风、GPU、编解码器

Thursday, August 2, 12

HOME键/锁屏

线程即刻会被挂起,内存资源可能会被回收

要立刻交还所有的硬件资源

摄像头、麦克风、GPU、编解码器

如果是后期编辑在渲染,退入后台再回来,就需要从头开始渲染

Thursday, August 2, 12

HOME键/锁屏

线程即刻会被挂起,内存资源可能会被回收

要立刻交还所有的硬件资源

摄像头、麦克风、GPU、编解码器

如果是后期编辑在渲染,退入后台再回来,就需要从头开始渲染

程序逻辑与渲染流水控制极其麻烦

Thursday, August 2, 12

边播边存

MPMoviePlayer是不能边播边存的

要自己搭建本地的HttpServer做Proxy

主要是为用户省流量,提高二次观看体验

Thursday, August 2, 12

IRISTM引擎

Interactive Rendering Integrated System

全平台

Thursday, August 2, 12

Timeline Manager

Output

Preview

Encode Engine

Render Engine

Decode EngineInput

Effect Manager

Thursday, August 2, 12

技术 编解码 渲染 拍摄 后期制作

iOS硬件CPUGPU

硬件 GPU实时特效 实时

视频剪辑特效混音字幕

Android硬件CPUGPU

硬件解CPU编 GPU实时特效 实时 开发中

Web FlashHTML5 GPU GPU实时 实时 同iOS

Server CPU CPU CPU超实时 无 无

Thursday, August 2, 12

iOS模块实现框图

MMFoundation

RenderEngine EncodeEngineDecodeEngine

AudioDecoder VideoDecoder

CaptureManager

MMDataStructure

VideoFramePoolAudioFramePool

EffectManager

ShaderPool VideoTexturePool

ScreenRenderObjTimelineManager ThreadManager

Thursday, August 2, 12

iOS模块实现框图

MMFoundation

RenderEngine EncodeEngineDecodeEngine

AudioDecoder VideoDecoder

CaptureManager

MMDataStructure

VideoFramePoolAudioFramePool

EffectManager

ShaderPool VideoTexturePool

ScreenRenderObjTimelineManager ThreadManager

Thursday, August 2, 12

iOS模块实现框图

MMFoundation

RenderEngine EncodeEngineDecodeEngine

AudioDecoder VideoDecoder

CaptureManager

MMDataStructure

VideoFramePoolAudioFramePool

EffectManager

ShaderPool VideoTexturePool

ScreenRenderObjTimelineManager ThreadManager

Thursday, August 2, 12

微酷集成了IRIS引擎的移动微视频分享社区

特点

所见即所得的拍摄体验

512Kbps码率,接近专业标清画质

流畅的3G网络视频上传和观看体验

以话题、地点等聚合视频

基于用户兴趣的个性推荐

Thursday, August 2, 12

Thursday, August 2, 12

Thursday, August 2, 12

Q&A

微酷捕捉精彩 瞬间分享

主页:http://vku.sdo.com邮件:vku@snda.com微博:@vku微酷 http://weibo.com/vkuvku

Thursday, August 2, 12

Recommended