FFmpeg --播放器框架及api使用

播放器框架

1媒体文件:
AVFormatContext
avformat_alloc_context avformat_open_input
2解复用器
AVStream
av_read_frame —
3音频(视频)包队列
AVPacket
4音频(视频)解码
AVCodecContext
avcodec_send_packet avcodec_receive_frame
采样(音频)/图像帧队列
AVFrame
音频(视频)处理

术语

容器/文件:如mp4、flv、mkv
媒体流:视频流:avc(h264) 音频流:aac
aac:1024个采样点为一帧 mp3:1152个采用点为一帧
数据帧/数据包(Frame/Packet)

编解码器

H264编码器: 图像YUV数据----H264帧,反之解码器
AAC编码器: 声音PCM数据—AAC帧

FFmeg 结构

ffplay:
ffprovbe: libavformat libavcodec …
ffmpeg:

FFmeg库简介

AVUtil:核心工具库
AVFormat:文件格式和协议库
AVCodec:编解码库

FFmpeg 函数介绍

注册
avdevice_register_all()对设备进行注册
封装
avformat_alloc_context();负责申请一个AVFormatContext
结构的内存,并进行简单初始化
avformat_open_input();打开输入视频文件
avformat_find_stream_info():获取音视频文件信息
av_read_frame(); 读取音视频包 / avformat_seek_file(); 定位文件
avformat_close_input();关闭解复用器

解码

avcodec_alloc_context3(): 分配解码器上下文
avcodec_find_decoder():根据ID查找解码器 /
avcodec_find_decoder_by_name():根据解码器名字
avcodec_open2(): 打开编解码器
avcodec_send_packet(): 发送编码数据包
avcodec_receive_frame(): 接收解码后数据
avcodec_free_context():释放解码器上下文,包含了
avcodec_close():关闭解码器

查找解码器:
AVCodec_ff_h264_decoder = {
.name = “h264”; // 不同厂家,个人 命名不同
.id = “AV_CODEC_ID_H264”; //FFmpeg内部表示,ID相同
}

如果上下本数据保存在解码器里面,多路解码的时候数据会有冲突?
设计解码器,要做到可重入,AVCodecContex保存解码器数据

h264_decode_frame(AVcodecContext *avctx), 作为参数传入

FFmpg 3.x 组件注册方式

行av_register_all,把全局的解码器、编码器等结
构体注册到各自全局的对象链表里

FFmeg 数据结构简介

AVFormatContext: 封装格式上下文结构体(类似c++中的类),统领全局的结构体

AVInputFormat demuxer : 每种封装格式(FLV)对应的结构体

AVStream:视频文件中的每个视频(音频)流对应的结构体

AVCodecContext: 解编码器上下文结构体,保存了视频编码相关的信息

AVCodec:每种视频(音频)编码器(h264解码器)对应的一个结构体

AVPacket: 存储一帧压缩编码数据

AVFrame: 存储一帧解码后像素(采样(音频))数据

AVFormateContext 和 AVInputFormate 之间的关系?
avFormatContex API 调用 , AVInputFormate 主要是ffmpeg内部调用
数据:
struct AVInputFormate *iformate; // 封装格式结构体
方法:
int (*read_header)(struct AVFormateContext * ); //函数指针

AVFormateContex AVStream AVCodecContext 之间的关系?
AVFormatContext -->
avformat_find_stream_info() : AVStream[0]/n—>
avcodec_parameters_to_context() —AVCodecContext[0]

你可能感兴趣的:(FFmpeg,ffmpeg,音视频)