ios - AVAssetWriter 仅在 iOS 13 设备上具有音频“噼啪声”
问题描述
我使用 AVCaptureSession 使用 AVAssetWriter 写入 mov 文件。iOS 13 之前的设备上的相同代码没有裂纹。在所有 iOS 13 设备上,无论 iPhone/iPad 型号如何,都有音频噼啪声。
我已将此作为错误提交给 Apple,但我担心我遗漏了一些简单的东西。还有其他人遇到这种情况吗?我可以更改设置的任何想法吗?
我尝试过的事情
- 改变 mov -> mpeg
- 尝试了多种音频编解码器(尤其是 AppleLossless 和 AAC)
- 推送到主队列而不是指定的 captureQueue
- 试过 AVCaptureMovieFileOutput,crackle 不存在。问题特定于 AVAssetWriter
- AVCaptureSession 总是在 44100 中提供音频,所以我在 AVAssetWriter 中将其重新采样为 48000。裂纹仍然存在。
任何想法都会有所帮助!
设置
self.session = [[AVCaptureSession alloc] init];
[self.session setSessionPreset:AVCaptureSessionPresetiFrame1280x720];
NSError *error;
AVCaptureDevice *inputVideoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceVideoInput = [AVCaptureDeviceInput deviceInputWithDevice:inputVideoDevice error:&error];
if ([self.session canAddInput:deviceVideoInput]) {
[self.session addInput:deviceVideoInput];
}
AVCaptureDevice* mic = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput* micinput = [AVCaptureDeviceInput deviceInputWithDevice:mic error:nil];
if ([self.session canAddInput:micinput]) {
[self.session addInput:micinput];
}
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) };
[output setSampleBufferDelegate:self queue:_captureQueue];
[self.session addOutput:output];
AVCaptureAudioDataOutput* audioout = [[AVCaptureAudioDataOutput alloc] init];
[audioout setSampleBufferDelegate:self queue:_captureQueue];
[self.session addOutput:audioout];
[self setCameraPosition:NO];
[self.session startRunning];
self.preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
self.preview.videoGravity = AVLayerVideoGravityResizeAspect;
AVAssetWriter 初始化
_path = path;
[[NSFileManager defaultManager] removeItemAtPath:_path error:nil];
NSURL *url = [NSURL fileURLWithPath:self.path];
_writer = [AVAssetWriter assetWriterWithURL:url fileType:AVFileTypeQuickTimeMovie error:nil];
NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithFloat: frameSize.width], AVVideoWidthKey,
[NSNumber numberWithFloat: frameSize.height], AVVideoHeightKey,
nil];
_videoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:settings];
_videoInput.expectsMediaDataInRealTime = YES;
[_writer addInput:_videoInput];
AudioChannelLayout acl;
bzero( &acl, sizeof(acl));
acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
settings = [NSDictionary dictionaryWithObjectsAndKeys:
[ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[ NSNumber numberWithInt:(int)channels], AVNumberOfChannelsKey,
[ NSNumber numberWithFloat:sampleRate], AVSampleRateKey,
[ NSNumber numberWithInt: 64000 ], AVEncoderBitRateKey,
nil];
_audioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:settings];
_audioInput.expectsMediaDataInRealTime = YES;
[_writer addInput:_audioInput];
[_writer startWriting];
更新:: iPhone 11+ 设备没有噼啪声,似乎他们在引擎盖下使用编解码器进行了更改,导致“旧”设备出现问题。我已向 Apple 提交了一个错误并使用了技术支持。技术支持已验证 iPhone 11 没问题,而任何旧设备都有问题。对错误票的响应为零。
如果你能在可预见的未来远离 AVAssetWriter。
解决方案
推荐阅读
- r - 导入列名多于列名的 csv 文件
- node.js - 带有 mongodb 的 NodeJS 并发休息客户端
- p4-lang - P4 编译错误:不能跨阶段 3 到 4 拆分表 - 尝试使其更小,或使用 @stage 强制到后期
- python - 当模块A中的线程完成处理时如何通知模块B?
- postgresql - Apache Airflow - 安装问题:sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidSchemaName) no schema has been selected to create in
- javascript - 如何开玩笑地模拟 api 调用
- android - 如何确定我的 TextField 失去焦点后焦点的位置(Android Jetpack Compose)
- javascript - 如何防止 Javascript 在页面加载时运行?(尝试将功能放在头部...不起作用)
- swift - MapBox Navigation 设置中心和缩放级别,同时导航比默认值更大
- c - 如何遍历c中的文件?