基本步骤:

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 YUV420memcpy(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;//获取frameret = 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_EOFif (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++;这样我们的视频才会按照顺序播放,否则会花屏。

视频编码(H264编码)相关推荐

  1. Android视频编码--H264编码

    Android视频编码–H264编码 Android中的H264编码有两种编码方式: 硬编码 软编码 1.硬编码 Android中的H264硬编码主要是通过自身提供的API,调用底层的硬件模块实现编码 ...

  2. 【音视频】H264编码基础

    H264编码基础 0x1 基本介绍 视频是由一帧帧图像组成,视频为了不卡顿,一秒钟至少要16帧画面,但是图片内容太大,传输不现实.因此需要对他们编码. 官方文档:http://www.itu.int/ ...

  3. MediaCodec 编码H264 编码一帧后dequeueOutputBuffer为-1的问题

    在用android MediaCodec编码h264的时候,会遇到,dequeueOutputBuffer在成功获取到config帧(sps pps)及第一个I帧后,dequeueOutputBuff ...

  4. ffmpeg转换h265编码视频到h264编码

    ffmpeg -i inputfile -map 0 -c:a copy -c:s copy -c:v libx264 output.mkv

  5. iOS音视频开发-了解编码及视频

    1. 视频H264编码 1.1 为何编码? 从存储角度和网络传输以及通用性 3个角度,压缩已经成了不可或缺的动作.压缩编码最基本的指标,就是压缩比. 压缩比通常都是小于1(如果等于或者大于1,是不是就 ...

  6. 采集音频和摄像头视频并实时H264编码及AAC编码

    0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...

  7. 采集音频和摄像头视频并实时H264编码及AAC编码[转]

    0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...

  8. ffmpeg的H264编码 视频逐渐模糊

    万能的互联网,又一次在临危之时解决了我的问题 最近在看ffmpeg里的H264编码,然后试着去做了一下.但是目前发现一个问题,就是编码写入的.264文件,用播放器(VLC,暴风都试过)播放后,发现编码 ...

  9. 音视频开发(29)---深入浅出理解视频编码H264结构

    深入浅出理解视频编码H264结构 编码流程: 那么 H.264 其编解码流程是怎么样的呢?其实可以主要分为 5 部分: 帧间和帧内预测(Estimation).变换(Transform)和反变换.量化 ...

  10. Android音视频【一】H264编码基础

    人间观察 岁月催人,时间过的太快了 音视频编码解码就是指通过特定的压缩/解压技术,将某个音视频格式的数据转换为另一种音视频格式数据.目前在Android中的音视频用的最多的就是H264+aac的方式进 ...

最新文章

  1. 滑动轮播图实现最后一张图片无缝衔接第一张图片
  2. (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
  3. 9 Redis 持久化AOF
  4. 推荐15个在线多媒体(图片、音频、视频)编辑器
  5. 重温Javascript(四)-函数
  6. iHealth基于Docker的DevOps CI/CD实践
  7. [Kaggle] Housing Prices 房价预测
  8. vue-cli多环境配置
  9. java中workbook_java使用Workbook进行excel读取和创建
  10. grub rescue 修复
  11. java 维文生成图片_维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)...
  12. odex vdex art区别
  13. PHP中的ZIP压缩与解压
  14. 用JavaScript做一个日历和用canvas做一个时钟
  15. 全面设防 让广播风暴远离局域网
  16. Unity项目捏脸解决方案BlendShape
  17. QR码生成原理(一)
  18. 码码在线考勤系统笔记(四)
  19. YouTube深度学习推荐
  20. ERROR: Failed building wheel for ctcdecode

热门文章

  1. 汉诺(Hanoi)塔问题
  2. 36家主要上市银行绿色信贷余额、绿色信贷占比、资产收益率、不良贷款率等数据 (2007-2019年)
  3. GRE阅读难句教程(一)
  4. (二十四)解释器模式详解
  5. discuz!论坛开发积分充值插件教程
  6. 基于jsp的银行柜员业务绩效考核系统设计与实现(项目报告+源代码+数据库+部署视频)
  7. 什么是投资银行,与商业银行区别(转载)
  8. js中onmouseover事件不起作用
  9. 一致性(Consistency)介绍
  10. 一年过去了,路在何方