Как декодировать кадр 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);
}

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

2 ответов


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

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

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

изменить:

эта ссылка предоставляет более подробное объяснение того, как декодировать h.264 шаг за шагом:stackoverflow.com/a/29525001/3156169

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

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

спикер говорит:

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

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

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