FFmpeg:如何从 OSX CMSampleBufferRef 获取 AVPacket
FFmpeg: How to get AVPacket from OSX CMSampleBufferRef
我是 AV 技术的新手,一直在尝试将 FFmpeg 与 Apple 的 CoreVideo 框架结合起来处理网络摄像头捕获。
首先,我有来自 CoreVideo 的网络摄像头捕获(可以从 AVCaptureVideoDataOutputSampleBufferDelegate 中找到),由 CMSampleBuffer
表示
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {}
由此,在没有存储为临时文件的情况下,我想将其放入 FFmpeg 的 AVPacket 以便我可以处理。
有谁知道我应该研究哪个 FFmpeg api?
假设您可以访问缓冲区原始数据,您首先需要创建一个 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);
我是 AV 技术的新手,一直在尝试将 FFmpeg 与 Apple 的 CoreVideo 框架结合起来处理网络摄像头捕获。
首先,我有来自 CoreVideo 的网络摄像头捕获(可以从 AVCaptureVideoDataOutputSampleBufferDelegate 中找到),由 CMSampleBuffer
表示- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {}
由此,在没有存储为临时文件的情况下,我想将其放入 FFmpeg 的 AVPacket 以便我可以处理。
有谁知道我应该研究哪个 FFmpeg api?
假设您可以访问缓冲区原始数据,您首先需要创建一个 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);