FFmpeg: как получить AVPacket из OSX CMSampleBufferRef

Я новичок в технологии AV и пытался объединить FFmpeg с платформой Apple CoreVideo для обработки захватов с веб-камеры.

Во-первых, у меня есть снимки с веб-камеры из CoreVideo (которые можно найти в AVCaptureVideoDataOutputSampleBufferDelegate), представленные CMSampleBuffer.

- (void)captureOutput:(AVCaptureOutput *)captureOutput
  didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
  fromConnection:(AVCaptureConnection *)connection {}

Из этого, без сохранения в качестве временного файла, я хотел бы сделать его AVPacket FFmpeg, чтобы я мог его обработать.

Кто-нибудь знает, какой API FFmpeg мне следует изучить?


person wao813    schedule 26.03.2015    source источник


Ответы (1)


Предполагая, что у вас есть доступ к необработанным данным буфера, вам сначала нужно создать AVPicture, затем заполнить его необработанными данными, а затем закодировать кадр.

вам также может потребоваться проверить формат пикселей кадра (например, YUV442, YUV420, ARGB,...)

int result;
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *codec_context = avcodec_alloc_context3(codec);

uint8_t *frame_bytes; //this should hold the frame raw data
AVFrame *frm = av_frame_alloc();    
result = avpicture_fill((AVPicture*) frm, frame_bytes, AV_PIX_FMT_YUV410P, frame_width, frame_height);
assert(!result);

AVPacket pkt;
int got_packet;

av_init_packet(&pkt);
result = avcodec_encode_video2(codec_context, &pkt, frm, &got_packet);
assert(!result);
person Mohamed El-Sayed    schedule 30.03.2015
comment
Спасибо Мохамед. Хотя у меня все еще есть другие проблемы, эта часть выглядит хорошо! - person wao813; 02.04.2015
comment
Я думаю, вы также можете проверить пример muxing.c. ffmpeg.org/doxygen/trunk/muxing_8c-source.html дает хорошая идея о том, как написать кодировщик, вы можете изменить код fill_yuv_image, чтобы заполнить изображение своими данными. - person Mohamed El-Sayed; 03.04.2015
comment
Большой! Я проверю это! - person wao813; 06.04.2015
comment
Мохамед, не могли бы вы проверить и это? stackoverflow.com/questions/29502563/ - person wao813; 08.04.2015