Вопрос или проблема
При сжатии видео, записанного на iPhone 16 Pro Max с использованием AVFoundation, возникает проблема во время аудиосжатия. При вызове метода AVAssetWriterInput appendSampleBuffer статус писателя меняется на “неудача” и выводится следующее сообщение об ошибке.
Некоторые ключевые коды:
self.audioSettings = @{
AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: @2,
AVSampleRateKey: @44100,
AVEncoderBitRateKey: @128000,
};
[self.audioInput requestMediaDataWhenReadyOnQueue:self.inputQueue usingBlock:^ {
while (input.isReadyForMoreMediaData) {
CMSampleBufferRef sampleBuffer = [output copyNextSampleBuffer];
if (sampleBuffer) {
if ([input appendSampleBuffer:sampleBuffer]) {
// Что-то пошло не так!
}
}
}
}];
Информация об ошибке:
Error Domain=AVFoundationErrorDomain Code=-11800 "Эта операция не может быть выполнена" UserInfo={
NSLocalizedFailureReason=Произошла неизвестная ошибка(-12780),
NSLocalizedDescription=Эта операция не может быть выполнена,
NSUnderlyingError=0x3023db8a0 {
Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"
}
}
Что произошло и как это исправить?
Ответ или решение
Проблема с AVFoundation на iPhone 16 Pro Max: Анализ и Решение
Когда вы работаете с AVFoundation на iPhone 16 Pro Max и сталкиваетесь с проблемой при сжатии аудио в видеофайле, это может стать серьезным препятствием в процессе разработки. В данном случае, ошибка происходит при вызове метода appendSampleBuffer
у объекта AVAssetWriterInput
, что приводит к изменению статуса писателя на failed
. Давайте подробнее разберем природу проблемы и пути её решения.
Общее Описание Проблемы
Вы используете настройки для аудио, задаваемые через объект audioSettings
, включая кодек kAudioFormatMPEG4AAC
, два канала, частоту дискретизации 44100 Гц и битрейт 128 Кбит/с. При вызове метода requestMediaDataWhenReadyOnQueue:usingBlock:
для асинхронной обработки аудио данных возникает проблема, в результате которой метод appendSampleBuffer:
не может корректно обработать входящий аудиоданных.
Вывод Ошибки
Ошибка, которую вы получаете:
Error Domain=AVFoundationErrorDomain Code=-11800 "This operation cannot be completed" UserInfo={
NSLocalizedFailureReason=An unknown error occurred(-12780),
NSLocalizedDescription=This operation cannot be completed,
NSUnderlyingError=0x3023db8a0 {
Error Domain=NSOSStatusErrorDomain Code=-12780 "(null)"
}
}
Эта ошибка часто указывает на несоответствие формата или проблемы при работе с данными аудио. Код -12780
в NSOSStatusErrorDomain
как правило сигнализирует о том, что данные, предоставленные для записи, имеют недопустимый или неподдерживаемый формат.
Возможные Причины и Решения
-
Проверка Формата Аудио Данных
Убедитесь, чтоCMSampleBufferRef
, который вы передаете вappendSampleBuffer
, действительно соответствует форматам, указанным вaudioSettings
. Используйте методCMSampleBufferGetFormatDescription
для анализа формата буфера. Если формат не соответствует ожиданиям (например, неправильный кодек, количество каналов или частота дискретизации), это станет причиной ошибки. -
Правильная Инициализация AVAssetWriterInput
Убедитесь, что объектaudioInput
инициализирован корректно. Например, проверьте, что он правильно объединен сAVAssetWriter
и что он в состоянииready
, прежде чем вызыватьappendSampleBuffer:
.Пример:
self.audioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:self.audioSettings];
-
Валидация Аудио Канала
Проверьте, что количество каналов в вашем аудиоданых совпадает с заданным вaudioSettings
. Если вы передаете монофонные аудиоданные, в то время как ожидается стерео, это также может вызвать ошибку. -
Обработка Подходящих Параметров
Убедитесь, что параметры кодирования, установленные вaudioSettings
, допустимы для устройства и версий iOS. Например, некоторые устройства могут иметь ограничения на параметры кодирования. -
Логи и Диагностика
Включите дополнительные логи в вашем коде, чтобы получить больше информации о том, какой именно шаг вызывает ошибку. С помощьюos_log
можно детализировать статусы и события, которые позволяет понять, где именно происходит сбой.
Заключение
Ошибки при работе с AVFoundation могут быть сложными для диагностики, особенно на новых устройствах, таких как iPhone 16 Pro Max. Правильная проверка форматов, параметров аудиоданных и настройка объекта AVAssetWriterInput может помочь справиться с этой проблемой. Убедитесь, что ваши настройки соответствуют спецификациям устройства и отмечайте любые аномалии в логах, чтобы устранить неполадки более эффективно.