FFmpeg:如何从OSX CMSampleBufferRef获取AVPacket

时间:2015-03-26 21:53:53

标签: ios objective-c macos ffmpeg core-video

我是AV技术的新手,并一直试图将FFmpeg与Apple的CoreVideo框架结合起来处理网络摄像头捕获。

首先,我有来自CoreVideo的网络摄像头捕获(可以从AVCaptureVideoDataOutputSampleBufferDelegate找到)由 CMSampleBuffer

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

从那以后,没有商店作为临时文件,我想把它变成FFmpeg的 AVPacket ,这样我就可以处理了。

有谁知道我应该研究哪种FFmpeg api?

1 个答案:

答案 0 :(得分:2)

假设您可以访问缓冲区原始数据,首先需要创建一个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);