I frame 和 P frame


ref:http://bbs.csdn.net/topics/280002948

1、NAL、Slice与frame意思及相互关系 

NAL指网络提取层,里面放一些与网络相关的信息
Slice是片的意思,264中把图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(Slilce);片由宏块(MB)组成。宏块是编码处理的基本单元。

2、NAL nal_unit_type中的1(非IDR图像的编码条带)、2(编码条带数据分割块A)、3(编码条带数据分割块B)、4(编码条带数据分割块C)、5(IDR图像的编码条带)种类型 
与 Slice种的三种编码模式:I_slice、P_slice、B_slice 
NAL nal_unit_type 里的五种类型,代表接下来数据是表示啥信息的和具体如何分块。
I_slice、P_slice、B_slice 表示I类型的片、P类型的片,B类型的片.其中I_slice为帧内预测模式编码;P_slice为单向预测编码或帧内模式;B_slice 中为双向预测或帧内模式。

3、还有frame的3种类型:I frame、P frame、 B frame之间有什么映射关系么? 
I frame、P frame、 B frame关系同 I_slice、P_slice、B_slice,slice和frame区别在问题1中已经讲明白。

4、最后,NAL nal_unit_type中的6(SEI)、7(SPS)、8(PPS)属于什么帧呢? 
NAL nal_unit_type 为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)不属于啥帧的概念。表示后面的数据信息为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)。

FFmpeg是一个功能强大的多媒体处理框架,它支持多种格式的转换、流编辑以及编码等操作。而I420是YUV的一种编码格式,常见于视频压缩标准如H.264。OpenCV是一个计算机视觉库,Mat是其核心数据结构,用于存储图像。 要将FFmpeg的I420帧转换为OpenCV的Mat,你可以使用FFmpeg的API通过`libavcodec`库读取I420数据,然后利用OpenCV提供的函数将其转换成Mat。这里是一个简单的示例: ```cpp #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> cv::Mat convertI420ToMat(const uint8_t* i420Data, int width, int height) { // 初始化Mat,I420颜色空间有三个分量:Y(亮度),U(蓝色差分),V(红色差分) cv::Mat yuv, yuv420sp(height, width, CV_8UC1), bgr; // 分离YUV通道 int planes[] = {0, 1, 2}; int linesize[] = {width, 1, 1}; avpicture_fill((AVPicture*) &yuv420sp, (uchar*)i420Data, AV_PIX_FMT_YUV420P, width, height); for (int plane = 0; plane < 3; ++plane) { cv::Mat channel(height, width, CV_8UC1, yuv420sp.data[planes[plane]]); if (plane == 0) { yuv = channel; // Y Plane is the only one we'll keep in our Mat } else { cv::split(yuv420sp, bgr); channel.copyTo(bgr[plane - 1]); } } // 将YUV转换为BGR cvtColor(yuv, bgr, COLOR_YUV2BGR_I420); return bgr; } // 使用示例 av_register_all(); AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264); // 假设视频是H.264编码 std::vector<uint8_t> i420Data = ...; // 获取到的I420数据 AVFrame frame; ... if (avcodec_decode_video2(codec, &frame, &got_frame, video_buffer)) { cv::Mat result = convertI420ToMat(frame.data[0], frame.width, frame.height); // 现在result就是OpenCV的Mat,可以进一步处理了 } ``` 注意,这个例子假设你已经解码了一个包含I420帧的视频,并且获取到了帧的数据。实际应用,你需要根据具体的输入数据来调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值