视频编码(H264编码)

这篇具有很好参考价值的文章主要介绍了视频编码(H264编码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本步骤:

  1、打开编码器

void open_codecer(int width, int heigth,AVCodecContext **enc_ctx){
    
    int ret = 0 ;
    AVCodec *codec = NULL;
    codec = avcodec_find_decoder_by_name("libx264");
    if (!codec) {
        printf("codec libx264 not found\n");
        exit(1);
    }
    
    *enc_ctx = avcodec_alloc_context3(codec);
    if (!enc_ctx) {
        printf("could not alloc video codec context\n");
        exit(1);
    }
    //SPS/PPS
    (*enc_ctx)->profile = FF_PROFILE_H264_HIGH_444;
    (*enc_ctx)->level = 50; //表示LEVEL5.0
    
    //设置分辨率
    (*enc_ctx)->width = width;//宽
    (*enc_ctx)->height = heigth;//高
    
    //设置GOP(分组)
    (*enc_ctx)->gop_size = 25;
    (*enc_ctx)->keyint_min = 3; //最小插入I帧的间隔(可选)
    
    //设置B帧的数量
    (*enc_ctx)->max_b_frames = 3;// 一般不超过3帧(可选)
    (*enc_ctx)->has_b_frames = 1;// (可选)
    
    //参考帧数量
    (*enc_ctx)->refs = 3; // 参考帧数量(可选)
    
    //设置输入YUV格式
    (*enc_ctx)->pix_fmt = AV_PIX_FMT_YUV420P;
    
    //设置码率
    (*enc_ctx)->bit_rate = 600*1000; // 600kbps
    
    //设置帧率
    (*enc_ctx)->time_base = (AVRational){1,25};//帧与帧之间的间隔
    (*enc_ctx)->framerate = (AVRational){25,1};//帧率,每秒25帧
    
    // 打卡编码器
    ret = avcodec_open2((*enc_ctx), codec, NULL);
    if (ret<0) {
        printf("failed to open codecer: %s!\n ",av_err2str(ret));
        exit(1);
    }
}

        2、转换NV12到YUV420,这是因为FFmpeg的x264编码器只支持YUV420

while (ret=av_read_frame(ps, &pkt)==0) {

        //YYYYYYYYUVUV NV12
        //YYYYYYYYUUVV YUV420
        memcpy(fram->data[0], pkt->size, 307200);
        for (i=0; i<307200/4; i++) {
            fram->data[1][i] = pkt->data[307200+i*2];
            fram->data[2][i] = pkt->data[307201+i*2];
        }
        //把YUV写入文件
        fwrite(fram->data[0], 1, 307200, yuvoutfile);
        fwrite(fram->data[1], 1, 307200/4, yuvoutfile);
        fwrite(fram->data[2], 1, 307200/4, yuvoutfile);
        av_packet_unref(pkt);
    }

        3、准备编码数据AVFrame

        创建frame:

 static AVFrame* create_frame(int width, int height){
     int ret = 0;
     AVFrame* frame = NULL;
     frame = av_frame_alloc();
     if (!frame) {
         printf("");
     }
     //设置参数
     frame->width = width;
     frame->height = height;
     frame->format = AV_PIX_FMT_YUV420P;
     //获取frame
     ret = av_frame_get_buffer(frame, 32); //按32位对齐
     if (ret<0) {
         printf("");
     }
     return frame;
}

 创建AVPacket:

AVPacket* pck = av_packet_alloc();

4、H264编码

     avcodec_send_frame(<#AVCodecContext *avctx#>, <#const AVFrame *frame#>)

    avcodec_receive_packet(<#AVCodecContext *avctx#>, <#AVPacket *avpkt#>)

static void encoder(AVCodecContext *enc_ctx,AVFrame *frame,
                    AVPacket *newpkt,FILE *outfile){
    int ret = 0;
    // 送原始数据到编码器进行编码
    ret = avcodec_send_frame(enc_ctx, frame);
    if (ret<0) {
        printf("");
    }
    // 从编码器获取编码好的数据
    if (ret>=0) {
        ret = avcodec_receive_packet(enc_ctx, newpkt);
        // 如果编码器数据不足时,返回EAGAIN,或者到数据尾时返回AVERROE_EOF
        if (ret==AVERROR(EAGAIN)||ret ==AVERROR_EOF) {
            return;
        }else{
            printf("");
            exit(1);
        }
        fwrite(newpkt->data, 1, newpkt->size, outfile);
        av_packet_unref(newpkt);
    }
}

注意:

        1、编码器中有未吐出的数据,需要再次调用encoder(AVCodecContext *enc_ctx,NULL,
                    AVPacket *newpkt,FILE *outfile)编码函数,frame传NULL。

        2、对于输入的编码器函数的参数frame,我们需要设置frame->pts,int base = 0 frame->pts=base++;这样我们的视频才会按照顺序播放,否则会花屏。文章来源地址https://www.toymoban.com/news/detail-437676.html

到了这里,关于视频编码(H264编码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【解决】萤石云接入视频报错视频编码类型非H264

    说在前面 项目视频监控设备接入了萤石云,部分视频无法正常加载,报错页面如下: 原因分析 视频监控视频编码目前有H265和H264两种,萤石云仅支持H264的编码格式,所以对于接入的视频流才会出现这种错误。 解决方案 方案一:如果你能接触到项目部网络,可以参考萤石云

    2024年02月14日
    浏览(61)
  • RK3568平台开发系列讲解(音视频篇)H264 的编码结构

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数

    2024年02月09日
    浏览(63)
  • 视频基础学习六——视频编码基础三(h264框架配合图文+具体抓包分析 万字)

    视频基础学习一——色立体、三原色以及像素 视频基础学习二——图像深度与格式(RGB与YUV) 视频基础学习三——视频帧率、码率与分辨率 视频基础学习四——视频编码基础一(冗余信息) 视频基础学习五——视频编码基础二(编码参数帧、GOP、码率等) 视频基础学习六

    2024年04月15日
    浏览(46)
  • 各大浏览器对H264、H265编码格式视频的支持情况

    web项目开发时,经常会遇到播放视频的情况,目前主流的视频编码格式有:H264、H265、VP8、VP9、DIVX等,主流的浏览器有:谷歌、火狐、Edge、Safari等,但由于浏览器对各编码的支持程度不一,导致部分视频无法播放,具体支持情况如下图(仅供参考): AVC(h264) HEVC(H265) MPEGS(D

    2024年02月14日
    浏览(43)
  • 火山引擎 BVE 视频图片硬件编码器演进之路

    动手点关注 干货不迷路 近日,第 17 届世界编码器大赛 MSU 2022 公布硬件编码器比赛结果,在 60 fps(帧率)的超快视频编码赛道上,火山引擎多媒体实验室自主研发的 BVE 1.1 编码器表现突出,荣获最佳 FPGA 编码器(各项指标大幅领先);并在所有硬件编码器中,技术指标获得

    2024年02月06日
    浏览(52)
  • 世界杯直播 | 抖音视频编码器优化

    动手点关注 干货不迷路 对于世界杯这样的大型体育赛事而言,视频编码算法既要在高速运动、复杂纹理的场景下确保直播内容的清晰度和流畅度,保障用户的观赛体验,又要兼顾码率、延迟等对网络传输层面尤为敏感的指标。 另外,抖音实现了业界首次的世界杯比赛支持

    2023年04月09日
    浏览(50)
  • 【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

    大家好,欢迎来到停止重构的频道。 本期我们讨论音视频文件 转编码 ,如将视频H264转H265等。 内容中所提及的 代码都会放在GitHub ,感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺序展开讨论:​ 1、  编码的作用  2、  转编码的工作原理 3、  编解码器安装  4、  示

    2024年02月11日
    浏览(49)
  • 最简单的基于 FFmpeg 的视频编码器(YUV 编码为 HEVC(H.265))

    参考雷霄骅博士的文章,链接:最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265)) 前一阵子做过一个基于 FFmpeg 的视频编码器的例子:最简单的基于 FFmpeg 的视频编码器(YUV 编码为 H.264)。 在该例子中,可以将 YUV 像素数据(YUV420P)编码为 H.264 码流。因为 FFmpeg

    2024年04月27日
    浏览(51)
  • H265、VP9、AV1视频编码器性能对比

    目前在视频编解码器中,H264 已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司的目标是持续降本增效,现在将”屠刀“指向了视频业务的存储成本。视频文件存储主要两块

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包