笔记:使用FFMpeg进行H264编码
2013-08-21 11:53
519 查看
转自:http://blog.csdn.net/eightdegree/article/details/7425635
使用FFMpeg可以很方便的对音视频进行编码,并且写文件。
下面的代码是将5幅1280*720大小的图片进行编码,并且写到文件中。
代码有些乱,但希望能抛砖引玉,对学习这方面的朋友有帮助。
使用FFMpeg可以很方便的对音视频进行编码,并且写文件。
下面的代码是将5幅1280*720大小的图片进行编码,并且写到文件中。
代码有些乱,但希望能抛砖引玉,对学习这方面的朋友有帮助。
CFile file[5]; BYTE *szTxt[5]; int nWidth = 0; int nHeight= 0; int nDataLen=0; int nLen; CString csFileName; for (int fileI = 1; fileI <= 5; fileI ++) { csFileName.Format("e:\\pics\\%d.bmp", fileI); file[fileI - 1].Open(csFileName,CFile::modeRead | CFile::typeBinary); nLen = file[fileI - 1].GetLength(); szTxt[fileI -1] = new BYTE[nLen]; file[fileI - 1].Read(szTxt[fileI - 1], nLen); file[fileI - 1].Close(); //BMP bmi;//BITMAPINFO bmi; //int nHeadLen = sizeof(BMP); BITMAPFILEHEADER bmpFHeader; BITMAPINFOHEADER bmpIHeader; memcpy(&bmpFHeader,szTxt[fileI -1],sizeof(BITMAPFILEHEADER)); int nHeadLen = bmpFHeader.bfOffBits - sizeof(BITMAPFILEHEADER); memcpy(&bmpIHeader,szTxt[fileI - 1]+sizeof(BITMAPFILEHEADER),nHeadLen); nWidth = bmpIHeader.biWidth;// 464;// bmi.bmpInfo.bmiHeader.biWidth;// ; nHeight = bmpIHeader.biHeight;//362;// bmi.bmpInfo.bmiHeader.biHeight;// ; szTxt[fileI - 1] += bmpFHeader.bfOffBits; nDataLen = nLen-bmpFHeader.bfOffBits; } av_register_all(); avcodec_register_all(); AVFrame *m_pRGBFrame = new AVFrame[1]; //RGB帧数据 AVFrame *m_pYUVFrame = new AVFrame[1];; //YUV帧数据 AVCodecContext *c= NULL; AVCodecContext *in_c= NULL; AVCodec *pCodecH264; //编码器 uint8_t * yuv_buff;// //查找h264编码器 pCodecH264 = avcodec_find_encoder(CODEC_ID_H264); if(!pCodecH264) { fprintf(stderr, "h264 codec not found\n"); exit(1); } c= avcodec_alloc_context3(pCodecH264); c->bit_rate = 3000000;// put sample parameters c->width =nWidth;// c->height = nHeight;// // frames per second AVRational rate; rate.num = 1; rate.den = 25; c->time_base= rate;//(AVRational){1,25}; c->gop_size = 10; // emit one intra frame every ten frames c->max_b_frames=1; c->thread_count = 1; c->pix_fmt = PIX_FMT_YUV420P;//PIX_FMT_RGB24; //av_opt_set(c->priv_data, /*"preset"*/"libvpx-1080p.ffpreset", /*"slow"*/NULL, 0); //打开编码器 if(avcodec_open2(c,pCodecH264,NULL)<0) TRACE("不能打开编码库"); int size = c->width * c->height; yuv_buff = (uint8_t *) malloc((size * 3) / 2); // size for YUV 420 //将rgb图像数据填充rgb帧 uint8_t * rgb_buff = new uint8_t[nDataLen]; //图象编码 int outbuf_size=100000; uint8_t * outbuf= (uint8_t*)malloc(outbuf_size); int u_size = 0; FILE *f=NULL; char * filename = "e:\\pics\\myData.h264"; f = fopen(filename, "wb"); if (!f) { TRACE( "could not open %s\n", filename); exit(1); } //初始化SwsContext SwsContext * scxt = sws_getContext(c->width,c->height,PIX_FMT_BGR24,c->width,c->height,PIX_FMT_YUV420P,SWS_POINT,NULL,NULL,NULL); AVPacket avpkt; //AVFrame *pTFrame=new AVFrame for (int i=0;i<250;++i) { //AVFrame *m_pYUVFrame = new AVFrame[1]; int index = (i / 25) % 5; memcpy(rgb_buff,szTxt[index],nDataLen); avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, PIX_FMT_RGB24, nWidth, nHeight); //将YUV buffer 填充YUV Frame avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, PIX_FMT_YUV420P, nWidth, nHeight); // 翻转RGB图像 m_pRGBFrame->data[0] += m_pRGBFrame->linesize[0] * (nHeight - 1); m_pRGBFrame->linesize[0] *= -1; m_pRGBFrame->data[1] += m_pRGBFrame->linesize[1] * (nHeight / 2 - 1); m_pRGBFrame->linesize[1] *= -1; m_pRGBFrame->data[2] += m_pRGBFrame->linesize[2] * (nHeight / 2 - 1); m_pRGBFrame->linesize[2] *= -1; //将RGB转化为YUV sws_scale(scxt,m_pRGBFrame->data,m_pRGBFrame->linesize,0,c->height,m_pYUVFrame->data,m_pYUVFrame->linesize); int got_packet_ptr = 0; av_init_packet(&avpkt); avpkt.data = outbuf; avpkt.size = outbuf_size; u_size = avcodec_encode_video2(c, &avpkt, m_pYUVFrame, &got_packet_ptr); if (u_size == 0) { fwrite(avpkt.data, 1, avpkt.size, f); } } fclose(f); delete []m_pRGBFrame; delete []m_pYUVFrame; delete []rgb_buff; free(outbuf); avcodec_close(c); av_free(c);
相关文章推荐
- <开发笔记>搭建LAMP服务器及使用FFMPEG进行切片、生成m3u8文件
- Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试
- java学习笔记:使用zip api进行文件解压缩以及不解压直接读取指定文件内容
- 机器学习实战笔记-使用Apriori算法进行关联分析
- 笔记:ffmpeg使用实例:yuv->h264,pcm->aac
- Python笔记–IAR使用Python脚本实现自动对烧录文件进行处理
- 【python笔记】使用matplotlib,pylab进行python绘图
- Android Studio使用笔记(1)使用android studio时避免每次启动都进行网络gradle sync的方法
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- 使用winHex对RDB和AOF原理进行剖析笔记(10)
- 使用FFmpeg对视频进行编解码的一般流程
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(二)
- 【我的Java笔记】IO流_使用IO流进行文件的复制和粘贴
- HTML5项目笔记8:使用HTML5 的跨域通信机制进行数据同步
- (浏览器兼容问题)使用ffmpeg进行视频格式转换的用法
- (转)使用FFMpeg进行H264编码 .
- Pyspark系列笔记--使用pyspark进行spark-submit
- 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器笔记(十)
- 学习笔记: Struts2中使用validate框架对Action的不同方法进行验证
- ArcGIS API for JavaScript 4.2学习笔记[23] 没有地图如何进行查询?【FindTask类的使用】