ios – AVAssetReaderOutput copyNextSampleBuffer在设备上编码带有音频的视频时挂起

前端之家收集整理的这篇文章主要介绍了ios – AVAssetReaderOutput copyNextSampleBuffer在设备上编码带有音频的视频时挂起前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这个问题 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],否则他们会这样做.

猜你在找的iOS相关文章