利用ffmpeg将YUV420P转成jpg格式文件,保存
2017-09-12 22:07
483 查看
我的程序需要在文件转码的同时去截图,按首祯截图和时间序列截图,但困扰于如何保存成jpg格式。
方案一:
利用ffmpeg将从文件读取出来的祯解码成YUV420P像素格式,用ffmpeg编码成jpg格式
借鉴于雷博士的最简单的基于FFmpeg的图像编码器 连接:http://blog.csdn.net/leixiaohua1020/article/details/25346147
方案二:
自己按照jpg格式,写jpg文件或者利用libjpeg转换
提供一个jpg格式头分析,连接 : http://www.cnblogs.com/lakeone/p/3596996.html
用libjpeg开源库去转换,我的程序内没采用这种方案,提供个连接:http://blog.csdn.net/yixianfeng41/article/details/52181578
下面贴上我的代码:
/**************************************************
* 函数名称: Frame2JPG
* 功能描述: 将AVFrame(YUV420格式)保存为JPEG格式的图片
* 参 数: AVPacket packetav_read_frame读取的一包数据
* 参 数: AVFrame * pFrame解码完的帧
* 参 数: stream_index流下标,标记是视频流还是音频流
* 参 数: int widthYUV420的宽
* 参 数: int heightYUV420的高
* 返 回 值: int 0 代表成功,其他失败
* 其他说明:
* 其它说明:
* 修改日期 修改人 修改内容
* --------------------------------------------
**************************************************/
如有不足之处,还请指出。
下一步将把编译ffmpeg以及转码demo附上
方案一:
利用ffmpeg将从文件读取出来的祯解码成YUV420P像素格式,用ffmpeg编码成jpg格式
借鉴于雷博士的最简单的基于FFmpeg的图像编码器 连接:http://blog.csdn.net/leixiaohua1020/article/details/25346147
方案二:
自己按照jpg格式,写jpg文件或者利用libjpeg转换
提供一个jpg格式头分析,连接 : http://www.cnblogs.com/lakeone/p/3596996.html
用libjpeg开源库去转换,我的程序内没采用这种方案,提供个连接:http://blog.csdn.net/yixianfeng41/article/details/52181578
下面贴上我的代码:
/**************************************************
* 函数名称: Frame2JPG
* 功能描述: 将AVFrame(YUV420格式)保存为JPEG格式的图片
* 参 数: AVPacket packetav_read_frame读取的一包数据
* 参 数: AVFrame * pFrame解码完的帧
* 参 数: stream_index流下标,标记是视频流还是音频流
* 参 数: int widthYUV420的宽
* 参 数: int heightYUV420的高
* 返 回 值: int 0 代表成功,其他失败
* 其他说明:
* 其它说明:
* 修改日期 修改人 修改内容
* --------------------------------------------
**************************************************/
int Frame2JPG(AVPacket packet, AVFrame* pFrame, unsigned int stream_index, int width, int height) { // 输出文件路径 char out_file[MAX_PATH] = { 0 }; sprintf_s(out_file, sizeof(out_file), "%s%d.jpg", "f:\\", packet.pts); // 分配AVFormatContext对象 AVFormatContext* pFormatCtx = avformat_alloc_context(); // 设置输出文件格式 pFormatCtx->oformat = av_guess_format("mjpeg", NULL, NULL); // 创建并初始化一个和该url相关的AVIOContext if (avio_open(&pFormatCtx->pb, out_file, AVIO_FLAG_READ_WRITE) < 0) { gDebug().Write("Couldn't open output file."); return -1; } // 构建一个新stream AVStream* pAVStream = avformat_new_stream(pFormatCtx, 0); if (pAVStream == NULL) { gDebug().Write("Frame2JPG::avformat_new_stream error."); return -1; } // 设置该stream的信息 AVCodecContext* pCodecCtx = pAVStream->codec; pCodecCtx->codec_id = pFormatCtx->oformat->video_codec; pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO; pCodecCtx->pix_fmt = AV_PIX_FMT_YUVJ420P; pCodecCtx->width = width; pCodecCtx->height = height; pCodecCtx->time_base.num = 1; pCodecCtx->time_base.den = 25; // Begin Output some information // av_dump_format(pFormatCtx, 0, out_file, 1); // End Output some information // 查找解码器 AVCodec* pCodec = avcodec_find_encoder(pCodecCtx->codec_id); if (!pCodec) { gDebug().Write("找不到图片编码器."); return -1; } // 设置pCodecCtx的解码器为pCodec if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { gDebug().Write("Could not open codec."); return -1; } //Write Header int ret = avformat_write_header(pFormatCtx, NULL); if (ret < 0) { gDebug().Write("Frame2JPG::avformat_write_header.\n"); return -1; } int y_size = pCodecCtx->width * pCodecCtx->height; //Encode // 给AVPacket分配足够大的空间 AVPacket pkt; av_new_packet(&pkt, y_size * 3); int got_picture = 0; ret = avcodec_encode_video2(pCodecCtx, &pkt, pFrame, &got_picture); if (ret < 0) { gDebug().Write("Encode Error.\n"); return -1; } if (got_picture == 1) { //pkt.stream_index = pAVStream->index; ret = av_write_frame(pFormatCtx, &pkt); } av_free_packet(&pkt); //Write Trailer av_write_trailer(pFormatCtx); if (pAVStream) { avcodec_close(pAVStream->codec); } avio_close(pFormatCtx->pb); avformat_free_context(pFormatCtx); return 0; }
如有不足之处,还请指出。
下一步将把编译ffmpeg以及转码demo附上
相关文章推荐
- 利用ffmpeg截取视频图像并保存为ppm和jpg图片格式
- 利用ffmpeg0.5 和libjpeg实现抽取视频帧并将其保存为jpeg文件格式程序
- 利用ffmpeg0.5 和libjpeg实现抽取视频帧并将其保存为jpeg文件格式程序
- ffmpeg获取摄像头数据保存成YUV420P格式
- 利用ov511的webeye v2000摄像头实现YUV420P格式转RGB24格式来抓取一张图片
- ffmpeg 转换其他格式到YUV420P
- 使用ffmpeg将YUV420P图像压缩到jpg图片
- RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中
- 利用ov511的webeye v2000摄像头实现YUV420P格式转RGB24格式来抓取一张图片
- VC屏幕截图并保存为bmp、jpg、png等格式文件
- 利用ffmpeg将RTSP传输的h264原始码流保存到文件中
- 利用Winpcap的pcap_dump()保存的文件格式
- 利用ffmpeg将RTSP传输的h264原始码流保存到文件中
- GDI+ 将BMP 32图像转换为JPG文件格式保存
- 使用ffmpeg实现解码并保存为yuv文件
- FFmpeg-利用ffplay.c保存视频解码后的数据yuv420
- 使用FFMPEG编码保存MPEG-1/MPEG-2文件格式
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
- JPG,PNG等格式的图片转换的ICON保存为ICO文件
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码