FFmpeg软硬解码和多线程解码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alex-panda

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

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

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

打赏作者

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

抵扣说明:

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

余额充值