FFMPEG播放视屏(不播声音)

ffmpeg解码视频,代码主要来自网络:

 

int main()
{
 AVFormatContext *pFormatCtx;
 int    i, videoindex;
 AVCodecContext *pCodecCtx;
 AVCodec   *pCodec;
 char filepath[]="test.mp4";
 av_register_all();
 avformat_network_init();
 pFormatCtx = avformat_alloc_context();
 if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0){
  printf("无法打开文件\n");
  return -1;
 }
 if(av_find_stream_info(pFormatCtx)<0)
 {
  printf("Couldn't find stream information.\n");
  return -1;
 }
 videoindex=-1;
 for(i=0; i<pFormatCtx->nb_streams; i++)
  if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)
  {
   videoindex=i;
   break;
  }
  if(videoindex==-1)
  {
   printf("Didn't find a video stream.\n");
   return -1;
  }
  pCodecCtx=pFormatCtx->streams[videoindex]->codec;
  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  if(pCodec==NULL)
  {
   printf("Codec not found.\n");
   return -1;
  }
  if(avcodec_open(pCodecCtx, pCodec)<0)
  {
   printf("Could not open codec.\n");
   return -1;
  }
  AVFrame *pFrame,*pFrameYUV;
  pFrame=avcodec_alloc_frame();
  pFrameYUV=avcodec_alloc_frame();
  uint8_t *out_buffer;
  out_buffer=new uint8_t[avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)];
  avpicture_fill((AVPicture *)pFrameYUV, out_buffer, PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { 
   printf( "Could not initialize SDL - %s\n", SDL_GetError());
   exit(1);
  }
  SDL_Surface *screen;
  screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);
  if(!screen) {  printf("SDL: could not set video mode - exiting\n"); 
  exit(1);
  }
  SDL_Overlay *bmp;
  bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,SDL_YV12_OVERLAY, screen);
  SDL_Rect rect;

  int ret, got_picture;
  static struct SwsContext *img_convert_ctx;
  int y_size = pCodecCtx->width * pCodecCtx->height;

  AVPacket *packet=(AVPacket *)malloc(sizeof(AVPacket));
  av_new_packet(packet, y_size);

  printf("文件信息\n");
  av_dump_format(pFormatCtx,0,filepath,0);


  while(av_read_frame(pFormatCtx, packet)>=0)//读取数据
  {
   if(packet->stream_index==videoindex)//判断数据类型
   {
    ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);//解码数据
    if(ret < 0)
    {
     printf("解码错误\n");
     return -1;
    }
    if(got_picture)
    {
     img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);
     sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);

     SDL_LockYUVOverlay(bmp);
     bmp->pixels[0]=pFrameYUV->data[0];
     bmp->pixels[2]=pFrameYUV->data[1];
     bmp->pixels[1]=pFrameYUV->data[2];    
     bmp->pitches[0]=pFrameYUV->linesize[0];
     bmp->pitches[2]=pFrameYUV->linesize[1];  
     bmp->pitches[1]=pFrameYUV->linesize[2];
     SDL_UnlockYUVOverlay(bmp);
     rect.x = 0;   
     rect.y = 0;   
     rect.w = pCodecCtx->width;   
     rect.h = pCodecCtx->height;   
     SDL_DisplayYUVOverlay(bmp, &rect); //显示图像

     SDL_Delay(50);
    }
   }
   av_free_packet(packet);
  }
  delete[] out_buffer;
  av_free(pFrameYUV);
  avcodec_close(pCodecCtx);
  avformat_close_input(&pFormatCtx);

  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值