ffmpeg+x264最简单的编码示例

news/2024/7/10 19:10:06 标签: ffmpeg
ffmpeg不包含h264编码部分,要做h264编码需要额外引入x264库。


二 最简单的h264 编码代码以及设置的一些基本参数
int EncodeH264(const AVPacket *srcpkt,AVPacket *out_pkt)
{
    if(srcpkt == NULL || out_pkt == NULL)
    {
        srs_error("pkt is null here ##\n");
        return -1;
    }
    AVFrame *frame = av_frame_alloc();
    if(frame == NULL)
    {
        srs_error("av_frame_alloc failed ##\n");
        return -2;
    }


    int GetFrame = 0;
    int ret = avcodec_decode_video2(f_SrcCodecCtx_,frame,&GetFrame,srcpkt);
    if(ret < 0 || GetFrame == 0)
    {
        srs_error("avcodec_decode_video2 failed ##\n");
        return -3;
    }


    EncodeParam encode_param = {0};
    encode_param.widht = frame->width;
    encode_param.height = frame->height;
    if(InitEncoder(encode_param) != 0)
    {
        srs_error("InitEncoder failed ##\n");
        return -4;
    }
    
    int got_packet = 0;
    if(f_DstCodecCtx_ == NULL)
    {
        if(InitEncoder(encode_param) != 0)
        {
            srs_error("f_DstCodecCtx_ NULL InitEncoder failed ##\n");
            return -6;
        }
    }
    
    ret = avcodec_encode_video2(f_DstCodecCtx_,out_pkt,frame,&got_packet);
    if(ret < 0 || got_packet == 0)
    { 
        srs_error("avcodec_encode_video2 failed ##\n");
        return -5;
    }
    return 0;
}


int InitEncoder(EncodeParam encode_param)
    {
        if(encode_param == param_)
        {
            return 0;
        }
        //printf("InitEncoder param reInit OK ###\n");


        f_DstCodec_ = avcodec_find_encoder((enum AVCodecID)dst_code_type_);
        if(f_DstCodec_ == NULL)
        {
            srs_error("avcodec_find_encoder failed ##\n");
            return -2;
        }


        if(f_DstCodecCtx_)
        {
            avcodec_flush_buffers(f_DstCodecCtx_);
            avcodec_close(f_DstCodecCtx_);
            avcodec_free_context(&f_DstCodecCtx_);
            f_DstCodecCtx_ = NULL;
        }
        
        f_DstCodecCtx_ = avcodec_alloc_context3(f_DstCodec_);
        if(f_DstCodecCtx_ == NULL)
        {
            srs_error("avcodec_alloc_context3 failed ##\n");
            return -4;
        }


        av_dict_set(&m_encode_dic, "profile", "main", 0);//profile类型
        av_dict_set(&m_encode_dic, "preset", "veryslow", 0);//预设值,
        av_dict_set(&m_encode_dic, "tune",   "zerolatency", 0);
        av_opt_set(f_DstCodecCtx_->priv_data, "x264opts", "rc-lookahead=30", 0);
        f_DstCodecCtx_->width               = encode_param.widht;
        f_DstCodecCtx_->height              = encode_param.height;
        f_DstCodecCtx_->gop_size            = 25;
        f_DstCodecCtx_->has_b_frames        = false;
        f_DstCodecCtx_->pix_fmt             = AV_PIX_FMT_YUV420P;
        f_DstCodecCtx_->max_b_frames        = 0;
        f_DstCodecCtx_->thread_count        = 1;
        f_DstCodecCtx_->qmin                = 1;
        f_DstCodecCtx_->qmax                = 40;
        f_DstCodecCtx_->max_qdiff           = 4;
        f_DstCodecCtx_->keyint_min          = 1;
        f_DstCodecCtx_->me_subpel_quality   = 4;
        f_DstCodecCtx_->refs                = 1;
        f_DstCodecCtx_->bit_rate            = 1000000; // use cbr instead
        f_DstCodecCtx_->rc_max_rate         = 1000000;
        f_DstCodecCtx_->rc_buffer_size      = 1000000;
        f_DstCodecCtx_->bit_rate_tolerance  = 300000;
        f_DstCodecCtx_->rc_initial_buffer_occupancy = 0;


        f_DstCodecCtx_->time_base.num       = 1;
        f_DstCodecCtx_->time_base.den       = 20;
    
        if(avcodec_open2(f_DstCodecCtx_,f_DstCodec_,&m_encode_dic) != 0)
        {
            srs_error("avcodec_open2 failed ##\n");
            return -6;
        }
        param_ = encode_param;
        return 0;

    }






http://www.niftyadmin.cn/n/793524.html

相关文章

h264编码算法由浅入深(二)霍夫曼编码

H264压缩中有个重要的算法&#xff0c;熵编码&#xff0c;熵编码分为两种cavlc&#xff08;哈夫曼编码也叫变长编码&#xff09;和cabac&#xff08;算术编码&#xff09;&#xff0c;这些都是无损压缩编码 一 要弄懂哈夫曼编码之前先了解一下哈夫曼树 给定n个权值座位n个叶子节…

h264编码算法由浅入深(二)算数编码

也是一种概率编码。 例如有一个串a,b,c,d,a,d,a,c,d p(a) 0.375 p(b) 0.125 p(c) 0.25 p(d) 0.375 总体思想是&#xff1a;把1分成元素个数份&#xff0c;每一份大小为概率值 按字符出现的位置标记出现的段。具体标记方法下面文章有详细介绍。具体实现细节可以参考文章&am…

h265帧格式

H265 nalu head格式 000000 01 nalu type 01 content 例如&#xff1a;&#xff08;具体nalu type值对应的类型可以上网查一下&#xff09; 00 00 00 01 40 01 的nuh_unit_type的值为 32&#xff0c; 语义为视频参数集 VPS00 00 00 01 42 01 的nuh_unit_type的值为 33…

用ffmpeg+x264如何编出动态gop的视频流

一 一般编码h264的时候需要设置gop size, group of picture size,意思是多少帧出现一个I帧。 这个值设置之后&#xff0c;编码器出帧就会严格按照这个间隔来的&#xff0c;那有人想要在画面运动剧烈的时候尽可能降低gop&#xff0c;在静态的时候增大gop&#xff0c;怎样做呢&am…

用ffmpeg读取网络视频流为什么会启动很慢?

一 ffmpeg几乎是万能的&#xff0c;很多人会用ffmpeg用来做流媒体协议解析。接口统一&#xff0c;调用非常方便 调用示例&#xff1a;av_register_all();avformat_network_init();//注册网络流格式avformat_alloc_context();//申请流格式上下文avformat_find_stream_info(ctx, …

H264解码器原理之一

H264的层次结构包括VCL(视频编码层)与NAL(网络提取层)&#xff0c;具体的语法结构&#xff0c;在之前的文章已经提到过&#xff0c;这里就不再赘述了。NAL主要是把VCL的内容进行封装&#xff0c;帮助更好的适合复杂的网络环境。在解码端&#xff0c;NAL解码器又复杂拆分&#x…

解析音视频网络传输技术之一

前面讲解了音视频编解码的基本知识&#xff0c;相信阅读过的朋友&#xff0c;都有个基本的认识。音视频除了存储&#xff0c;还如何传输呢?比如直播互动&#xff0c;网上课堂等&#xff0c;这些场景中&#xff0c;音视频是如何实现在网络中传输呢?今天这篇文章&#xff0c;就…

ffmpeg如何从内存读取或者写流数据

一 ffmpeg默认的是从网络或者本地文件读取/写入数据 很多应用工程中&#xff0c;需要从内存读写数据以加快速度&#xff0c;或者由于操作磁盘权限不够等问题。 二 今天来讲讲如何让ffmpeg操作内存 在我的其它博客中讲解了从网络读取流数据的过程&#xff0c;这里就先简单补充一…