Как декодировать кадр 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 как
CMSampleBuffer
s за сеанс 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?