视频编码(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 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编码)相关推荐
- Android视频编码--H264编码
Android视频编码–H264编码 Android中的H264编码有两种编码方式: 硬编码 软编码 1.硬编码 Android中的H264硬编码主要是通过自身提供的API,调用底层的硬件模块实现编码 ...
- 【音视频】H264编码基础
H264编码基础 0x1 基本介绍 视频是由一帧帧图像组成,视频为了不卡顿,一秒钟至少要16帧画面,但是图片内容太大,传输不现实.因此需要对他们编码. 官方文档:http://www.itu.int/ ...
- MediaCodec 编码H264 编码一帧后dequeueOutputBuffer为-1的问题
在用android MediaCodec编码h264的时候,会遇到,dequeueOutputBuffer在成功获取到config帧(sps pps)及第一个I帧后,dequeueOutputBuff ...
- ffmpeg转换h265编码视频到h264编码
ffmpeg -i inputfile -map 0 -c:a copy -c:s copy -c:v libx264 output.mkv
- iOS音视频开发-了解编码及视频
1. 视频H264编码 1.1 为何编码? 从存储角度和网络传输以及通用性 3个角度,压缩已经成了不可或缺的动作.压缩编码最基本的指标,就是压缩比. 压缩比通常都是小于1(如果等于或者大于1,是不是就 ...
- 采集音频和摄像头视频并实时H264编码及AAC编码
0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...
- 采集音频和摄像头视频并实时H264编码及AAC编码[转]
0. 前言 我在前两篇文章中写了DirectShow捕获音视频然后生成avi,再进行264编码的方法.那种方法有一些局限性,不适合实时性质的应用,如:视频会议.视频聊天.视频监控等.本文所使用的技术, ...
- ffmpeg的H264编码 视频逐渐模糊
万能的互联网,又一次在临危之时解决了我的问题 最近在看ffmpeg里的H264编码,然后试着去做了一下.但是目前发现一个问题,就是编码写入的.264文件,用播放器(VLC,暴风都试过)播放后,发现编码 ...
- 音视频开发(29)---深入浅出理解视频编码H264结构
深入浅出理解视频编码H264结构 编码流程: 那么 H.264 其编解码流程是怎么样的呢?其实可以主要分为 5 部分: 帧间和帧内预测(Estimation).变换(Transform)和反变换.量化 ...
- Android音视频【一】H264编码基础
人间观察 岁月催人,时间过的太快了 音视频编码解码就是指通过特定的压缩/解压技术,将某个音视频格式的数据转换为另一种音视频格式数据.目前在Android中的音视频用的最多的就是H264+aac的方式进 ...
最新文章
- 滑动轮播图实现最后一张图片无缝衔接第一张图片
- (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
- 9 Redis 持久化AOF
- 推荐15个在线多媒体(图片、音频、视频)编辑器
- 重温Javascript(四)-函数
- iHealth基于Docker的DevOps CI/CD实践
- [Kaggle] Housing Prices 房价预测
- vue-cli多环境配置
- java中workbook_java使用Workbook进行excel读取和创建
- grub rescue 修复
- java 维文生成图片_维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)...
- odex vdex art区别
- PHP中的ZIP压缩与解压
- 用JavaScript做一个日历和用canvas做一个时钟
- 全面设防 让广播风暴远离局域网
- Unity项目捏脸解决方案BlendShape
- QR码生成原理(一)
- 码码在线考勤系统笔记(四)
- YouTube深度学习推荐
- ERROR: Failed building wheel for ctcdecode