AVAssetReader+AVAssetReaderTrackOutput
来源:互联网 发布:巨化集团待遇知乎 编辑:程序博客网 时间:2024/06/06 09:59
AVAssetReader+AVAssetReaderTrackOutput
既然AVPlayer在播放视频时会有性能问题,我们不如做自己的播放器。AVAssetReader可以从原始数据里获取解码后的音视频数据。结合AVAssetReaderTrackOutput,能读取一帧帧的CMSampleBufferRef。CMSampleBufferRef可以转化成CGImageRef。为此,我们可以写个MMovieDecoder的类,负责视频解码,每读出一个SampleBuffer就往上层回调:
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:m_asset error:&error];NSArray* videoTracks = [m_asset tracksWithMediaType:AVMediaTypeVideo];AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0];// 视频播放时,m_pixelFormatType=kCVPixelFormatType_32BGRA// 其他用途,如视频压缩,m_pixelFormatType=kCVPixelFormatType_420YpCbCr8BiPlanarVideoRangeNSDictionary* options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt: (int)m_pixelFormatType] forKey:(id)kCVPixelBufferPixelFormatTypeKey];AVAssetReaderTrackOutput* videoReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:options];[reader addOutput:videoReaderOutput];[reader startReading];// 要确保nominalFrameRate>0,之前出现过android拍的0帧视频while ([reader status] == AVAssetReaderStatusReading && videoTrack.nominalFrameRate > 0) { // 读取video sample CMSampleBufferRef videoBuffer = [videoReaderOutput copyNextSampleBuffer]; [m_delegate mMovieDecoder:self onNewVideoFrameReady:videoBuffer); CFRelease(videoBuffer); // 根据需要休眠一段时间;比如上层播放视频时每帧之间是有间隔的 [NSThread sleepForTimeInterval:sampleInternal];} // 告诉上层视频解码结束[m_delegate mMovieDecoderOnDecodeFinished:self];
另一个是MVideoPlayerView,负责视频的显示,它接收MMovieDecoder回调的CMSampleBufferRef后,把它转为CGImageRef,然后设置layer.contents为这个CGImageRef对象。创建CGImageRef不会做图片数据的内存拷贝,它只会当Core Animation执行Transaction::commit()触发layer -display时,才把图片数据拷贝到layer buffer里。
AVAssetReader也能decode音频的SampleBuffer,不过本人还没想到如何播放CMSampleBufferRef的音频,目前只能静音播放。
0 0
- AVAssetReader+AVAssetReaderTrackOutput
- 翻译:AVAssetReaderTrackOutput
- 翻译:AVAssetReader
- AVAssetReader和AVAssetWriter
- AVAssetReader 音频波形图
- AV Foundation系列(四)AVAssetReader和AVAssetWrite
- iOS 音视频高级编程:AVAssetReaderTrackOutput改变CMFormatDescription导致Video Toolbox解码失败与不解码GPU直接显示H.264帧
- 父页面用Iframe加载子页面时,获取子页面title!
- 准备3年,腾讯和阿里的疯狂补贴能让多少人暴富?(移动支付收银系统源码)
- AWK文本过滤器
- ZOJ
- python networkx学习
- AVAssetReader+AVAssetReaderTrackOutput
- jdk与jre
- 遗传算法C++例子
- Android仿手机震动的效果
- 计算一个小于十的数的阶乘和
- psql计算环比和同比
- Weblogic security
- Discuz!开发之修改论坛TAG页面,实现主题按发帖时间倒序排序(新帖在前)
- addEventListener中事件函数的this指向