位图图像到WEBM视频编码

时间:2013-11-21 13:42:07

标签: ffmpeg vp8

我正在尝试将位图图像编码为webm视频,但生成的视频无法播放 这是我正在使用的代码,代码适用于H624。 编码控制台窗口显示:[libvpx @ 009b2f60] v1.2.0 生成的视频文件中没有webm字符串。任何线索? (我是FFMPEG API的新手)

void create_from_bmp()
{
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;//  

pCodecH264 = avcodec_find_encoder(CODEC_ID_VP8);  
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 = 5;  //5 frames per sec
c->time_base= rate;//(AVRational){1,25};  
c->gop_size = 10; // emit one intra frame every ten frames   //emit one iframe per sec
c->max_b_frames=0;  //
c->thread_count = 1;  
c->pix_fmt = PIX_FMT_YUV420P;//PIX_FMT_RGB24;  
c->codec_id=CODEC_ID_VP8;

//av_opt_set(c->priv_data, /*"preset"*/"libvpx-1080p.ffpreset", /*"slow"*/NULL, 0);  
if(avcodec_open2(c,pCodecH264,NULL)<0)  
  printf("Cant open codec");

int size = c->width * c->height;  

yuv_buff = (uint8_t *) malloc((size * 3) / 2); // size for YUV 420    

uint8_t * rgb_buff = new uint8_t[nDataLen];  

int outbuf_size=400000;  
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)  
{  
  printf( "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<60;++i)  
{  
  //AVFrame *m_pYUVFrame = new AVFrame[1];  

  int index = (i / 5) % 5;  
  memcpy(rgb_buff,szTxt[index],nDataLen);  

  avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, PIX_FMT_RGB24, nWidth, nHeight);  

  avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, PIX_FMT_YUV420P, nWidth, nHeight);  

  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;  


  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);  
}

我想使用此代码通过编码屏幕截图来记录屏幕。我可以使用什么fps,gop大小或其他参数来减小视频的大小。

0 个答案:

没有答案