Проблема с AVFoundation на iPhone 16 Pro Max

Вопрос или проблема

При сжатии видео, записанного на 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 как правило сигнализирует о том, что данные, предоставленные для записи, имеют недопустимый или неподдерживаемый формат.

Возможные Причины и Решения

  1. Проверка Формата Аудио Данных
    Убедитесь, что CMSampleBufferRef, который вы передаете в appendSampleBuffer, действительно соответствует форматам, указанным в audioSettings. Используйте метод CMSampleBufferGetFormatDescription для анализа формата буфера. Если формат не соответствует ожиданиям (например, неправильный кодек, количество каналов или частота дискретизации), это станет причиной ошибки.

  2. Правильная Инициализация AVAssetWriterInput
    Убедитесь, что объект audioInput инициализирован корректно. Например, проверьте, что он правильно объединен с AVAssetWriter и что он в состоянии ready, прежде чем вызывать appendSampleBuffer:.

    Пример:

    self.audioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:self.audioSettings];
  3. Валидация Аудио Канала
    Проверьте, что количество каналов в вашем аудиоданых совпадает с заданным в audioSettings. Если вы передаете монофонные аудиоданные, в то время как ожидается стерео, это также может вызвать ошибку.

  4. Обработка Подходящих Параметров
    Убедитесь, что параметры кодирования, установленные в audioSettings, допустимы для устройства и версий iOS. Например, некоторые устройства могут иметь ограничения на параметры кодирования.

  5. Логи и Диагностика
    Включите дополнительные логи в вашем коде, чтобы получить больше информации о том, какой именно шаг вызывает ошибку. С помощью os_log можно детализировать статусы и события, которые позволяет понять, где именно происходит сбой.

Заключение

Ошибки при работе с AVFoundation могут быть сложными для диагностики, особенно на новых устройствах, таких как iPhone 16 Pro Max. Правильная проверка форматов, параметров аудиоданных и настройка объекта AVAssetWriterInput может помочь справиться с этой проблемой. Убедитесь, что ваши настройки соответствуют спецификациям устройства и отмечайте любые аномалии в логах, чтобы устранить неполадки более эффективно.

Оцените материал
Добавить комментарий

Капча загружается...