- MediaCodec相关
crop信息(x,y,m,n)左上坐标(x,y) 右下坐标(m,n),也就是解码宽高,宽=m-x+1,高=y-n+1
mediacodec的状态:(思考一下如果你创建mediacodec要做那些事情)
1.创建mediacodec后,处于uninitialized状态
2.config后,configured状态
3.start后,flushed状态,此时会清空所有buffer
4.buffer队列拿到第一个buffer时,进入running状态
5.stream带有eos标志时,进入eos状态
6.调用stop后,uninitialized状态
codec specific data 数据(h264/h265解码器要求的数据)
1.mediacodec要求的,所有正常数据来之前,必须先有csd数据
2.其中包含一些sps,pps信息,用于初始化、配置解码器参数等
H264 csd-0放sps信息、csd-1放pps信息
H265 只有csd-0,放sps、pps信息
MediaFormat参数中,很多需要配置的信息,都是在编码的时候才需要的,如framerate key-frame等信息,解码时候配置的参数不多
mediacodec常用操作
1.dequeueInputBuffer 返回一个空buffer的index
2.getInputBuffer(index) 返回对应index的buffer地址
3.queueInputBuffer 填充好数据之后,将数据送到mediacodec
4.dequeueOutputBuffer 获取解码器输出的buffer
5.releaseOutputBuffer 把buffer还给mediacodec
使用surface效率会高很多,dequeuOutputBuffer之后,直接releaseOutputBuffer,解码数据无需拷贝到java侧,直接在native侧送给surface,省去copy动作,效率提高 - MP4组成
mp4由各种box组成,每种不同box的功能不一样
首先由一个ftype box,包含文件的一些信息
其次是moov box,里面包含了很多子box,meta-data信息等
媒体数据包含在mdat信息中,也包含了很多子box
ftyp file type 文件版本,协议等信息
moov movie box 不包含具体数据,只包含对应信息
mdat meta data box 存放解码播放的数据 - ffmpeg
常见的视频格式:h264/h265/vp8/vp9/
ffmpeg框架包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtils等几个,重要的是前2个
libavcodec:存放各编解码器模块
libavformat:存放muxer/demuxer模块,各种音视频封装格式的生成和解析,包括获取解码所需的信息和生成
解码上下文的结构和读取音视频帧的功能,音视频的格式解析协议
libavutil:内存操作等模块,一些公共工具函数使用库,如内存等
libswscale:视频缩放、色彩转换,视频格式转换等
FFmpeg数据结构
AVFormatContext 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
iformat:输入视频的AVInputFormat
nb_streams :输入视频的AVStream 个数
streams :输入视频的AVStream []数组
duration :输入视频的时长(以微秒为单位)
bit_rate :输入视频的码率
AVInputFormat 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
name:封装格式名称
long_name:封装格式的长名称
extensions:封装格式的扩展名
id:封装格式ID
一些封装格式处理的接口函数
AVStream 视频文件中每个视频(音频)流对应一个该结构体。
id:序号
codec:该流对应的AVCodecContext
time_base:该流的时基
r_frame_rate:该流的帧率
AVCodecContext编码器上下文结构体,保存了视频(音频)编解码相关信息。
codec:编解码器的AVCodec
width, height:图像的宽高(只针对视频)
pix_fmt:像素格式(只针对视频)
sample_rate:采样率(只针对音频)
channels:声道数(只针对音频)
sample_fmt:采样格式(只针对音频)
AVCodec 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
name:编解码器名称
long_name:编解码器长名称
type:编解码器类型
id:编解码器ID
一些编解码的接口函数
AVPacket 存储一帧压缩编码数据。
pts:显示时间戳
dts :解码时间戳
data :压缩编码数据
size :压缩编码数据大小
stream_index :所属的AVStream
AVFrame存储一帧解码后像素(采样)数据。
data:解码后的图像像素数据(音频采样数据)。
linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。
width, height:图像的宽高(只针对视频)。
key_frame:是否为关键帧(只针对视频) 。
pict_type:帧类型(只针对视频) 。例如I,P,B。