本文由微信开发团队人员编写,转自 WeMobileDev,感谢。
微信小视频.jpg (27.89 KB, 下载次数: 1235)
下载附件 保存到相册
8 年前 上传
AVCaptionConnection.png (77.46 KB, 下载次数: 1280)
0.png (40.33 KB, 下载次数: 1198)
[GL] <MMovieWriter.mm:476::-[MMovieWriter appendAudioSampleBufferInternal:]> INFO: audio writer status 3, desc Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" UserInfo=0x11495910 {NSLocalizedDescription=这项操作无法完成, NSUnderlyingError=0x1146e8d0 "The operation couldn’t be completed. (OSStatus error -12633.)", NSLocalizedFailureReason=发生未知错误(-12633)}
//m_writer.movieFragmentInterval = CMTimeMakeWithSeconds(1.0, 1000); // AVAssetWriter
avplayerLayer_2x.png (18.12 KB, 下载次数: 1193)
NSURL* videoUrl = [NSURL fileURLWithPath:m_path isDirectory:NO]; m_playItem = [AVPlayerItem playerItemWithURL:videoUrl]; // 监听playItem的status属性 [m_playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
// AVPlayer m_player = [AVPlayer playerWithPlayerItem:m_playItem]; m_player.actionAtItemEnd = AVPlayerActionAtItemEndNone; // AVPlayerLayerView m_playerView = [[AVPlayerLayerView alloc] initWithFrame:self.bounds]; [self addSubview:m_playerView]; // 把AVPlayer添加到AVPlayerLayer [(AVPlayerLayer*)[m_playerView layer] setPlayer:m_player]; // 观察AVPlayerItem播放结束的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemPlayEnded:) name:AVPlayerItemDidPlayToEndTimeNotification object:m_playItem];
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_420YpCbCr8BiPlanarVideoRange NSDictionary* 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];
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:copper 发表于 2017-04-13 10:08 学习了,最近正在做小视频的开发,可以借鉴使用到自己的项目中,哈哈
引用:诗说穿石 发表于 2017-05-10 17:55 有源码github分享吗
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.447283 second(s), 47 queries , Gzip On.