我正在使用 AVAssetWriter 将屏幕重新编码保存为 mp4(带H.264
视频和aac
音频编码)。一切都按预期完美运行,但一些用户抱怨 0KB 视频大小问题,即没有数据写入输出文件。通过反复尝试,我能够重现此问题。它发生在几次成功写入之后(有时在 2 次之后,有时在 5 次之后,在某些机器上它从未发生过)。我比较了成功的流程和失败的日志。我发现的唯一一件事就是这个
CMIO_Unit_Converter_Audio.cpp:588:RebuildAudioConverter AudioConverterSetProperty() 失败 (1886547824)
在哪里
kAudioFormatUnsupportedPropertyError = 1886547824
这导致我在失败的情况下检查音频格式,但 AVAssetWriter 的音频格式非常好。我正在将音频写入器输入设置为 AVAssetWriter Inputs
[<AVAssetWriterInput: 0x600002047950, mediaType = vide, outputSettings = {
AVVideoCodecKey = avc1;
AVVideoHeightKey = 840;
AVVideoWidthKey = 1360;
}>, <AVAssetWriterInput: 0x60000205e740, mediaType = soun, outputSettings = {
AVFormatIDKey = 1633772320;
AVNumberOfChannelsKey = 2;
AVSampleRateKey = 44100;
}>]
我为视频和音频创建 AVAssetWriterInput 的代码如下 Audio AVAssetWriterInput
settings = [
AVFormatIDKey : kAudioFormatMPEG4AAC,
AVNumberOfChannelsKey : ch,
AVSampleRateKey : rate,
]
audioInput = AVAssetWriterInput(mediaType: .audio, outputSettings: settings)
视频 AVAssetWriterInput
var settings: [String : Any] = [
AVVideoWidthKey : cx,
AVVideoHeightKey : cy,
AVVideoCodecKey : AVVideoCodecType.h264,
]
videoInput = AVAssetWriterInput(mediaType: .video, outputSettings: settings)
我注意到在启动 AVCaptureSession 之后和之前出现日志中的AVCaptureVideoDataOutputSampleBufferDelegate
错误captureOutput
。我也记录了 AVCaptureSession 输入和输出。
AVCaptureSession 输入
[<AVCaptureScreenInput: 0x6000022e18e0>, <AVCaptureDeviceInput: 0x6000022e0a00 [Built-in Microphone]>]
AVCaptureSession 输出
[<AVCaptureAudioDataOutput: 0x6000022e1f40>, <AVCaptureVideoDataOutput: 0x60000228b7a0>]
但是我在这里也没有看到任何问题。几天来,我一直试图弄清楚这一点,但未能做到。我不知道是什么触发了它,即使一切设置正确,它也无法写入任何输出。如果我只写视频,这只会发生在视频+音频中,它才能正常工作。