Как декодировать фрейм H.264 на iOS с помощью аппаратного декодирования?

Я использовал ffmpeg для декодирования каждого кадра, который я получил от своего ip-камеры. Краткий код выглядит следующим образом:

-(void) decodeFrame:(unsigned char *)frameData frameSize:(int)frameSize{
   AVFrame frame;
   AVPicture picture;
   AVPacket pkt;
   AVCodecContext *context;
   pkt.data = frameData;
   pat.size = frameSize;
   avcodec_get_frame_defaults(&frame);
   avpicture_alloc(&picture, PIX_FMT_RGB24, targetWidth, targetHeight);
   avcodec_decode_video2(&context, &frame, &got_picture, &pkt);
}

Код woks отлично, но это программное декодирование. Я хочу улучшить производительность декодирования с помощью аппаратного декодирования. После многих исследований я знаю, что это может быть достигнуто с помощью системы AVFoundation. Класс AVAssetReader может помочь, но я не могу понять, что следующий. Может ли кто-нибудь указать на следующие шаги для меня? Любая помощь будет оценена.

Ответы

Ответ 1

iOS не предоставляет никакого публичного доступа непосредственно к аппаратным средствам декодирования, поскольку аппаратное обеспечение всегда используется для декодирования видео H.264 на iOS.

Следовательно, сеанс 513 предоставляет вам всю информацию, необходимую для разрешения поэтапного декодирования на iOS. Короче говоря, за этот сеанс:

  • Сгенерировать отдельные единицы уровня абстракции сети (NALU) из элементарного потока H.264. Существует много информации о том, как это делается в Интернете. VAL NALU (IDR и non-IDR) содержат ваши видеоданные и должны быть поданы в декодер.
  • Повторно упакуйте эти NALU в соответствии с форматом "AVCC", удалив стартовые коды NALU и заменив их на 4-байтовый заголовок длины NALU.
  • Создайте CMVideoFormatDescriptionRef из своих SPS и PPS NALU через CMVideoFormatDescriptionCreateFromH264ParameterSets()
  • Пакет NALU для пакетов CMSampleBuffer за сеанс 513.
  • Создайте VTDecompressionSessionRef и подайте VTDecompressionSessionDecodeFrame() с помощью пробных буферов
    • В качестве альтернативы используйте AVSampleBufferDisplayLayer, метод -enqueueSampleBuffer: устраняет необходимость создания собственного декодера.

Ответ 2

Edit:

Эта ссылка содержит более подробное объяснение того, как пошагово декорировать h.264: fooobar.com/info/112973/...

Оригинальный ответ:

Я вчера смотрел сеанс 513 "Прямой доступ к кодированию и декодированию видео" в WWDC 2014 и получил ответ на мой собственный вопрос.

Докладчик говорит:

У нас есть Video Toolbox (в iOS 8). Video Toolbox была там OS X на некоторое время, но теперь он, наконец, заполнен заголовками iOS.Это обеспечивает прямой доступ к кодоводам и декодерам.

Таким образом, нет возможности делать аппаратное декодирование кадр за кадром в iOS 7, но это можно сделать в iOS 8.

Есть ли кто-нибудь выяснить, как напрямую обращаться к видеокодированию и декодированию кадр за кадром в iOS 8?