ffmpeg 编码

编码可以简单理解为将连续的图片帧转变成视频流的过程。以H264为例给出编码的代码:

        int  InitEncoderCodec(int width, int height)
        {
            auto enc = avcodec_find_encoder(AV_CODEC_ID_H264);        
            encodeContext = avcodec_alloc_context3(enc);
            auto codec = encodeContext;
            codec->codec_id = enc->id;
            codec->time_base.num = 1;
            codec->time_base.den = 25;
            codec->gop_size = 10;
            codec->bit_rate = 400000;
            codec->pix_fmt            = AV_PIX_FMT_YUV420P;
            codec->width              =  width;
            codec->height             = height;
            codec->has_b_frames = 0;
            codec->max_b_frames = 0;
            AVDictionary* options = nullptr; 
            if (!av_dict_get(options, "threads", nullptr, 0))
            {
                av_dict_set(&options, "threads", "auto", 0);
            }
            auto hr = avcodec_open2(codec,enc,nullptr);
            return hr;
        }

稍微解释下:AV_CODEC_ID_H264是264 codec ID,如果是其他的编码器替换相应的ID.  avcodec_open2返回0表示打开编码器成功,打开失败返回负值。
encode输入是一个AVFrame。注意:Frame的宽高要与codec的宽高一致。编码后的packet组成PES流。

    shared_ptr<AVPacket> encode(AVFrame* frame)
        {    
            int gotpacket = 0;
            shared_ptr<AVPacket> packet = nullptr;
            shared_ptr<AVPacket> pkt((AVPacket*)av_malloc(sizeof(AVPacket)), [&](AVPacket *p){av_free_packet(p);av_freep(&p);});
            av_init_packet(pkt.get());
            pkt->data = nullptr;
            pkt->size = 0;
 
            int hr = avcodec_encode_video2(encodeContext, pkt.get(), frame, &gotpacket);
            if(hr >= 0 && gotpacket)
            {  
                packet = pkt;            
            }
            return packet;
        }        

 

转载于:https://my.oschina.net/u/3700450/blog/1545669

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值