在这个问题
Video Encoding using AVAssetWriter – CRASHES中实现编码视频(带音频)的解决方案之后,我发现代码在iPhone模拟器中正常工作.不幸的是,某些视频在实际的iPhone 5(和其他设备)上运行时无法对其音频进行编码.
例如,从WWDC 2011示例代码RosyWriter(https://developer.apple.com/library/IOS/samplecode/RosyWriter/Introduction/Intro.html)生成的视频不会完全编码,因为函数 – [AVAssetReaderOutput copyNextSampleBuffer]永远不会返回.
视频缓冲区正确进入,但只要它尝试复制第一个音频CMSampleBufferRef,呼叫就会挂起.当我尝试使用来自其他来源的视频时,例如原生iOS相机应用中记录的视频,音频导入正确.
该线程https://groups.google.com/forum/#!topic/coreaudio-api/F4cqCu99nUI记录了与AudioQueues一起使用时挂起的copyNextSampleBuffer函数,并建议将操作保留在单个线程上.我已经尝试将所有内容保存在主线程上的单独线程中,但没有运气.
有没有其他人经历过这个并有可能的解决方案?
编辑:从RosyWriter生成的视频看起来相对于来自本机Camera应用程序的视频,即音频流作为流0,视频流作为流1,它们的轨道相反.
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D),44100 Hz,mono,fltp,60 kb/s Metadata: creation_time : 2013-10-28 16:13:05 handler_name : Core Media Data Handler Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661),yuv420p,1920x1080,8716 kb/s,28.99 fps,29.97 tbr,600 tbn,1200 tbc Metadata: rotate : 90 creation_time : 2013-10-28 16:13:05 handler_name : Core Media Data Handler
不确定这是否会对AVAssetReader产生影响.
解决方法
我在iOS 9.3.2上仍然遇到这个问题,解决它的问题是确保AVAssetReaderAudioMixOutput *在调用时最初设置为选项而不是nil [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks].
例:
NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,[NSNumber numberWithFloat:44100.0],AVSampleRateKey,[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,[NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved,AVLinearPCMIsFloatKey,AVLinearPCMIsBigEndianKey,nil]; // create an AVAssetReaderOutput for the audio tracks NSArray* audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; AVAssetReaderAudioMixOutput* _audioReaderOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:outputSettings];
这阻止了以后调用 – [AVAssetReaderOutput copyNextSampleBuffer],否则他们会这样做.