9

在这个问题中实现了对视频(带音频)进行编码的解决方案之后,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记录了copyNextSampleBuffer与 AudioQueues 一起使用时挂起的函数,并建议将操作保留在单个线程上。我试过把所有东西都放在一个单独的线程上,在主线程上,但没有运气。

有没有其他人遇到过这种情况并有可能的解决方案?

编辑:从 RosyWriter 生成的视频的轨道似乎与来自本机相机应用程序的视频相反,即音频流作为流 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 产生影响。

4

4 回答 4

4

我在 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,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
                                    nil];

// create an AVAssetReaderOutput for the audio tracks
NSArray* audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio];
AVAssetReaderAudioMixOutput* _audioReaderOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:outputSettings];

这可以防止后来的呼叫-[AVAssetReaderOutput copyNextSampleBuffer]在他们这样做时挂起。

于 2016-07-27T02:17:24.843 回答
0

使用以下方法检查音轨上的时间范围:

NSLog(@"audioTrack timeRange: %lld, %lld", audioTrack.timeRange.start.value, audioTrack.timeRange.duration.value);

空时间范围 (0, 0) 可能导致 copyNextSampleBuffer() 挂起。

于 2014-01-17T13:35:25.143 回答
-1

这是 iOS7 中的一个 AVFoundation 错误。它现在已在 iOS8 中修复。

于 2014-09-20T19:26:52.310 回答
-1

这是一个特定于硬件的问题。我在模拟器、iPhone5 和 iPhone 6 上对其进行了测试。某些视频文件 100% 出现问题,但仅在 iPhone 5 上出现。虽然我不能为 iPhone 5S 说话。iOS8 没有解决这个问题。该修复程序可能不得不限制您的 iPhone 5 用户使用某些功能。另一种解决方法是让用户从他们的相机胶卷中选择一个视频,从而强制苹果对其进行特殊压缩——并将该视频转换为 iPhone 5 硬件可以使用的格式。

于 2015-07-30T00:06:01.097 回答