ffmpeg SDK软硬解码基础(解封装C++ NDK)

解封装->软硬件解码->像素格式转换->重采样->pts/dts->同步策略

ffmpeg音视频解封装用到的函数和结构体

av_register_all()     注册所有的解封装格式和加封装格式(通用各种格式)打Open()之前必须先调用它

avformat_network_init()    直接解Rtsp(我们的摄像机或摄像机协议),通过网络打开文件,还支持Http

比如:把一个视频放到web服务器上面,只要把http地址传过来,它同样可以打开,需要把这个网络模块初始化好

int avformat_open_input(...)       解析出里面的视频流,音频流及参数还有视频帧的索引

(1)av_register_all avformat_network_init 已调用

   (2)AVFormatContext **ps      指定格式(频繁使用)

  1. 传一个指针地址,这个指针地址指向空的空间,那么它内部就会创建这个空间
  2. 直接创建AVFormatContext在传进来,它会把这些解封装的内容全写到我们创建好的结构体里面。注意!清理出问题,动态链接库当中创建的链接只能在动态链接库里清理,外部的链接去动态链接库清理会出问题,所以要内存分离开来清理
  3. **ps指向的是空,那内存空间就有close()来清理(指针的指针:指针的地址 AVFormatContext (*p)传参就传&,把指针的地址传进来就好了)

(3)const char *url

(4)AVIContext *pb;char filename[1024];  自定义格式读或从内存里读(文件IO上下文)断开重连

(5)unsigned int nb_streams;

(6)AVStream **streams; 视频:宽高,帧率  音频:采样率,样本大小,格式

  •  AVCodecContent *codec;//过时了
  • AVRational time_base;//分数,1s占多少分之一
  • int64_t duration; //毫秒
  1. duration *((double) time_base.num/(double) time_base.den)*1000
  • int64_t nb_frames;
  • AVRational avg_frame_rate;  //帧率
  • AVCodeParameters *codecpar;(音视频参数)
  1. enum AVMediaType codec_type;
  2. enum AVCodecID codec_id;
  3. uint32_t codec_tag;
  4. int format; //样本格式
  5. int width;int height;
  6. uint64_t channel_layout;int  channel;int sample_rate;int frame_size;

(7)int64_t duration;//AV_TIME_BASE 这是宏,时间长度

(8)int64_t bit_rate;   1s占文件的大小,8bit一个字节,网络适应

(9)void avformat_close_input(AVFormatContext **s);  指针地址,关闭,把一块指针空间清理掉之后,要把它置零(而这个函数内部就帮我们置零了)

int avformat_find_stream_info(...)    查找文件的格式或索引 (探测)“获取文件(流)中的信息” 包含以下(1)(2)两个参数

(1)AVFormatContext *ic;

(2)AVDictionary **options

flv(没法获取时长)H262 mpeg2

av_find_best_stream(...)   

(1)解封装之后,需要处理,去分开音频和视频,要知道它们对应的参数,独立处理,需要找到音频流和视频流

(2)另一种方式是直接遍历它的返回值的成员数组streams[],存了所有流(视频,音频,字幕,扩展信息

int av_find_best_stream(

AVFormatContext *ic,

enum AVMediaType type,

int wanted_stream_nb,

int related_stream,

AVCodec ** decoder_ret,

int flags )

结构体
AVFormatContest   

AVStream   视频流和音频流都放在这里

AVPacket   针对封装完之后的具体的数据包 它包含了pts,dts,stream inst,它把HR_64的间隔符(0001或001)去除掉了,在做成自己格式发出去时,要添加,通过av_read_frame(...)读取,就能区分是音频还是视频了,而AVPacket并没有存这个内容是视频还是音频,只存了索引

  • AVBufferRef *buf;
  • int64_t pts;//p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-panda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值