FFmpeg YUV420保存JPEG例子
admin
2023-02-19 22:40:05
0

说明 FFmpeg3.4版本


bool SaveYUV420ToJPEG(const std::string &strFileName, int nWidth, int nHeight, int linesize, uint8_t * Y, uint8_t * U, uint8_t * V)
{
 AVFormatContext* pFormatCtx;
 AVCodecContext* pCodecCtx;
 AVCodec* pCodec;
 AVFrame* pFrame;   
 AVPacket pkt;       
 int nRet = 0; 
 
 avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, strFileName.c_str());   
   
 AVStream* pVideoAVStream = avformat_new_stream(pFormatCtx, 0);
 if (NULL == pVideoAVStream) return false;
  
 pCodecCtx = avcodec_alloc_context3(NULL);
 if (NULL == pCodecCtx) return false;

 avcodec_parameters_to_context(pCodecCtx, pVideoAVStream->codecpar);

 pCodecCtx->codec_id = pFormatCtx->oformat->video_codec;
 pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;  
 pCodecCtx->pix_fmt = AV_PIX_FMT_YUVJ420P;
 pCodecCtx->width  = nWidth;   
 pCodecCtx->height = nHeight;    
 pCodecCtx->time_base.num = 1;  
 pCodecCtx->time_base.den = 25;   

 pCodec = avcodec_find_encoder(pCodecCtx->codec_id);   
 if (NULL == pCodec) return false;
  
 if (avcodec_open2(pCodecCtx, pCodec,NULL) < 0)
 {         
  return false;  
 }   
 pFrame = av_frame_alloc();  

 int nJpegQuality = 80;     
 pCodecCtx->qcompress = (float)nJpegQuality/100.f; // 0~1.0, default is 0.5      
 pCodecCtx->qmin = 2;      
 pCodecCtx->qmax = 31;      
 pCodecCtx->max_qdiff = 3;       
   
 avformat_write_header(pFormatCtx,NULL);    
 av_new_packet(&pkt, pCodecCtx->width * pCodecCtx->height * 3);
 pFrame->data[0] = Y;   
 pFrame->data[1] = U;  
 pFrame->data[2] = V;   
 pFrame->linesize[0] = linesize;   
 pFrame->linesize[1] = linesize/2;   
 pFrame->linesize[2] = linesize/2;   
 
 nRet = avcodec_send_frame(pCodecCtx, pFrame);
 if (avcodec_receive_packet(pCodecCtx, &pkt) != 0) return false;
     
 pkt.stream_index = 0;       
 nRet = av_write_frame(pFormatCtx, &pkt);      
 av_packet_unref(&pkt);
  
 av_write_trailer(pFormatCtx);    
 avcodec_close(pCodecCtx);
 avcodec_free_context(&pCodecCtx);
 av_frame_free(&pFrame);       
 avio_close(pFormatCtx->pb);   
 avformat_free_context(pFormatCtx);    
 return true;
}


调用例子

SaveYUV420ToJPEG("fengyuzaitu.jpg", pFrame->width, pFrame->height, pFrame->linesize[0], pFrame->data[0], pFrame->data[1], pFrame->data[2]);


相关内容

热门资讯

服务六大场景 机器人公园上岗 玉渊潭公园投用水面割草机器人。(刘平 摄) 天坛公园的智能巡护机器人上岗。(刘平 摄) 盛夏七月,...
力箭一号遥十五运载火箭圆满完成... 红星新闻网7月24日讯2026年7月24日07时33分,我国在东风商业航天创新试验区使用力箭一号遥十...
特朗普:美方正与伊朗谈判,不排... 当地时间7月24日,美国总统特朗普在白宫谈及对伊朗战争的“退出战略”时表示,美国有两种选择:一是继续...
小伙相亲2天后花33万闪婚,一... 极目新闻记者 邓波2025年4月,安徽安庆小伙何攀到贵州贵阳花果园相亲,并与相识两天的贵阳籍女子陆某...
丘成桐:王虹和邓煜都在MIT待... 当地时间7月23日,在美国费城举行的2026年国际数学家大会开幕式上,中国数学家邓煜、王虹获得菲尔兹...
欧盟对俄制裁列单中企,中国驻欧... 问:2026年7月23日,欧盟通过第21轮对俄罗斯制裁方案,新增列单制裁中国企业。中方对此有何评论?...
特朗普预警9月政府“停摆”,美... 一国总统公开预警自家联邦政府即将“停摆”,这种魔幻剧情又双叒叕要在华盛顿上演?当地时间7月22日,特...
视频丨2026年APEC数字和... 昨天(23日),2026年亚太经合组织数字和人工智能部长会议在四川成都举行。本届会议的主题为“数字和...
海南商发二期发射区土建完工,建... 7 月 24 日消息,海南商发今日宣布,海南商业航天发射场二期发射区建设项目土建工作完成,全面转入设...
菲律宾,没有以色列的命,得了以... 菲律宾,马尼拉。美国国务卿鲁比奥来了。菲律宾期盼已久的“救星”来了。菲律宾认为的“阳光”来了。从机场...