FFmpeg: 如何从OSX CMSampleBufferRef获取AVPacket

3

我是一个新手,正在尝试将FFmpeg与苹果的CoreVideo框架结合起来处理网络摄像头捕获。

首先,我有来自CoreVideo的网络摄像头捕获(可以在AVCaptureVideoDataOutputSampleBufferDelegate中找到),它们由CMSampleBuffer表示。

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

我想将其转换为FFmpeg的AVPacket,而不需存储为临时文件,以便我可以处理。

有人知道我应该查找哪个FFmpeg API吗?

1个回答

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);

谢谢你,Mohamed。虽然我还有其他问题,但这部分看起来不错! - wao813
我认为您也可以查看 muxing.c 示例。 https://ffmpeg.org/doxygen/trunk/muxing_8c-source.html这个示例很好地演示了如何编写一个编码器,您可以修改代码 fill_yuv_image 来填充您的数据。 - Mohamed El-Sayed
太好了!我会去查看的! - wao813
Mohamed,你能不能也看一下这个问题?http://stackoverflow.com/questions/29502563/how-to-encode-picture-to-h264-use-avfoundation-on-mac-not-use-x264 - wao813

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接