avcodec_find_decoder
- avcodec_register_all();
- AVCodec *avcodec_find_decoder(enum AVCodecID id); //通过id号打开解码器
- AVCodec *avcodec_find_decoder_by_by_name(const char *name); //通过名字解码
- avcodec_find_decoder_by_name(*h264_mediacodec"); //调用它做解码模块(调java接口)
AVCodecContext
- AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
- void avcodec_free_context(AVCodecContext **avctx);
- int avcodec_open2(AVCodeContext *avctx,const AVCodec *codec,AVDICTIONARY **options);
- /libavcodec/options_table.h
- int thread_count;//这个成员设置可以指定CPU数量,CPU数量可以通过api来获取,也可以直接给它开通多线程
- time_base //时间基数,解码时候它会按这个时间格式来算的,对传过来的pts不变的话,会直接用av_stream里面的time_base来传递
编码模块和封装模块是分开来的
很多CPU都是八核,开八线程来进行解码,像835能达到240~250帧每秒,CPU占用率也会非常的高
avcodec_parameters_to_context 直接把av_stream里面的参数直接复制到codec当中
- avcodec_parameters_to_context(codec,p);
36.AVFrame 存放解码后的数据(其实没有视频概念,就是一副独立的图像,而AVPacket存的是一帧压缩的画面,它是有前后概念的)
- AVFrame *frame=av_frame_alloc();
- void av_frame_free(AVFrame **frame);
- int av_frame_ref(AVFrame *dst,const AVFrame *src); //引用,多线程访问复制到另外一边,对它进行访问
- AVFrame *av_frame_clone(const AVFrame *src);//毫秒级别
- void av_frame_unref(AVFrame *frame);
包含的内容
- uint8_t *data[AV_NUM_DATA_POINTERS];
- int linesize[AV_NUM_DATA_POINTERS];
- int width,height,int nb_samples;
- int64_t pts; //实际帧对应的
- int64_t pkt_dts;//包
- int sample_rate;uint64_t channel_layout;int channels;//视频用不到,是音频(样本率,通道类型、数量)
- int fromat;//AVPixelFormat AVSampleFormat 像素格式(区分音频和视频)

avcodec_send_packet 首先发送过去,存在解码队列当中 (两个接口)
- int avcodec_send_packet(AVCodecContext *avctx,const AVPacket *avpkt);//第一个参数:解封装的时有个上下文,现在解码也有个贯穿上下文,第二个参数:缓存(1.对象创建一块 2.对象引用加1,多次引用复制(记得清理))
avcode

最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



