FFmpeg--packet数据包和frame数据帧的区别

文章目录

基本概念

数据包(packet),是存储压缩编码数据的基本单位,在音频编码中,通常一个数据包只包含一帧数据,在视频编码中,由于B帧和P帧的存在,可以出现一个数据包包含多帧数据的情况

数据帧(frame), 存储非压缩数据的基本单位,对于视频为yuv 或者 rgb , 音频为aac数据

结构体字段:

Frame:

  • data[AV_NUM_DATA_POINTERS]:存放解码后的原始媒体数据的指针数组,
    对于视频数据,planar格式中, Y、U、V分量会被分别存放在data[0]、data[1]、data[2] ,packet格式的数据会被存放在data[0]中。
    对于音频数据,channel的不同声道分别存储在data[0]、data[1]等

AVPacket:

  • buf:指向数据包内存的引用。
  • pts 和 dts:分别代表显示时间戳和解码时间戳。
  • data 和 size:指向数据包的数据和大小。
  • stream_index:该数据包属于哪个流。

主要函数

获取音频/视频包:

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

// pkt 为解析后获取的数据包

cpp 复制代码
AVPacket *pkt = av_packet_alloc();
while (1)
    {
        av_read_frame(ifmt_ctx, pkt);
        av_packet_unref(pkt);
    }
    if(pkt)
        av_packet_free(&pkt);

获取音频/视频帧:

int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);

cpp 复制代码
AVFrame *pFrame = av_frame_alloc(); 
while(){
	av_receive_frame(ctx, pFrame);
	//...
	av_frame_unref(pFrame);         
} 
av_frame_free(pFrame);             
相关推荐
kkoral2 天前
OpenCV 与 FFmpeg 的关系
opencv·ffmpeg
kkoral2 天前
如何在 Python 中使用 OpenCV 调用 FFmpeg 的特定功能?
python·opencv·ffmpeg
山栀shanzhi2 天前
【FFmpeg】音视频MP4封装格式转封装MOV
ffmpeg·音视频
山栀shanzhi2 天前
【FFmpeg】是什么是未压缩的裸流?
c++·ffmpeg
Maverick063 天前
02-SQL执行计划与优化器:Oracle是怎么决定“该怎么查“的
数据库·sql·oracle·ffmpeg
EasyDSS3 天前
RTMP高清推流直播/智能转码/无人机直播EasyDSS破局旅游慢直播痛点
ffmpeg·旅游·视频转码·fmp4·点播技术
EasyDSS3 天前
RTMP高清推流直播/视频转码EasyDSS在无人机RTMP直播场景中的应用技术解析
ffmpeg·音视频·无人机·视频转码·语音转写·点播技术
私人珍藏库3 天前
[Windows] FFmpeg 图形化:EasyFF v0.17
ffmpeg·媒体·工具·软件·win·多功能
EasyDSS4 天前
场景深耕:低延迟高并发EasyDSS无人机RTMP高清推流直播技术剖析
ffmpeg·webrtc·rtmp
小鹿软件办公4 天前
FFmpeg 8.1 正式发布:引入 Vulkan 计算加速,支持 DPX 与 ProRes
ffmpeg