ffmpeg 重写tutorial01程序--将一个视频文件解码输出bmp和jpg文件
2012-03-22 16:43
806 查看
参考链接1:Compile LibJPEG
http://w3studi.informatik.uni-stuttgart.de/~bischowg/languages/C++/CPPlibjpeg.html
参考链接2:利用ffmpeg0.5 和libjpeg实现抽取视频帧并将其保存为jpeg文件格式程序
http://blog.csdn.net/xingyu19871124/article/details/4316776
参考链接3:ffmpeg 重写tutorial01程序--将一个视频文件解码输出ppm文件或bmp文件
http://blog.csdn.net/ajaxhe/article/details/7340508
之前写过一个将视频文件解码输出bitmap文件(见参考链接3),由于项目需要,需要输出jpg文件,由于jpg格式是有损压缩的,比bmp格式要复杂许多,简单google下,libjpeg开源库正合我意,使用起来简单清晰,网上很多朋友提供了很好的例子,我在windows7下编译花费了较多的时间。
操作系统: windows 7 旗舰版
开发环境:vs2008
相关库:ffmpeg,libjpeg
vs工程文件:
http://download.csdn.net/detail/ajaxhe/4163638
1. 编译libjpeg
以前编译ffmpeg受过伤,想偷个懒,想想这么通用的库,网上提供的的.lib应该很多的,google "libjpeg for windows",第一条就提供了相应的库,大喜,用之,而事实上,正是因为自己的拿来主义,导致我后面遇到了各种莫名奇妙的问题,在执行jpeg_wirte_scanlines()和jpeg_finish_compress()时出现"写入位置发生访问冲突",由于是编译好的lib库,无法单步调试到相关函数里面检查错误,这个问题让人很绝望。
网上google时,无意找到了Compile LibJPEG看看,似乎编译过程也并不复杂,报着最后一丝希望,决定自己编译下libjpeg。该文已经将编译过程写得很详细了,我在windows7下编译也没有任何问题。下面我做一个简单的翻译。
1.1 从 http://www.ijg.org/files/上下载jpegsrc.v6b.tar.gz。
1.2 解压,假设我们放在C:\temp\jpegsrc.v6b下。
1.3 重命名c:\jpegsrc.v6b\jpeg-6b\makefile.vc 为 c:\jpegsrc.v6b\jpeg-6b\Makefile。
1.4 重命名c:\jpegsrc.v6b\jpeg-6b\jconfig.vc 为 c:\jpegsrc.v6b\jpeg-6b\jconfig.h。
1.5 打开cmd(快捷键:win+r)
1.6 在cmd中运行如下命令。vsvars32.bat的位置可能会不同,结合自己情况修改。注意:""不能少
"C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
cd C:\temp\jpegsrc.v6b\jpeg-6b
nmake -f Makefile
1.7 编译成功后,在C:\temp\jpegsrc.v6b\jpeg-6b下会生成一个libjpeg.lib文件
1.8 对C:\temp\jpegsrc.v6b\jpeg-6b\jmorecfg.h进行修改:
and make it look like this:
1.9 对C:\temp\jpegsrc.v6b\jpeg-6b\jmorecfg.h进行修改:
and make it look like this:
1.10 将
"jconfig.h"
"jerror.h"
"jinclude.h"
"jmorecfg.h"
"jpeglib.h"
以及
jpegliblib
添加到你的vs2008工程文件中
2. 使用libjpeg
由于libjpeg是C语言写的,在包含jpeglib.h时需要加上
3. 部分源代码
http://w3studi.informatik.uni-stuttgart.de/~bischowg/languages/C++/CPPlibjpeg.html
参考链接2:利用ffmpeg0.5 和libjpeg实现抽取视频帧并将其保存为jpeg文件格式程序
http://blog.csdn.net/xingyu19871124/article/details/4316776
参考链接3:ffmpeg 重写tutorial01程序--将一个视频文件解码输出ppm文件或bmp文件
http://blog.csdn.net/ajaxhe/article/details/7340508
之前写过一个将视频文件解码输出bitmap文件(见参考链接3),由于项目需要,需要输出jpg文件,由于jpg格式是有损压缩的,比bmp格式要复杂许多,简单google下,libjpeg开源库正合我意,使用起来简单清晰,网上很多朋友提供了很好的例子,我在windows7下编译花费了较多的时间。
操作系统: windows 7 旗舰版
开发环境:vs2008
相关库:ffmpeg,libjpeg
vs工程文件:
http://download.csdn.net/detail/ajaxhe/4163638
1. 编译libjpeg
以前编译ffmpeg受过伤,想偷个懒,想想这么通用的库,网上提供的的.lib应该很多的,google "libjpeg for windows",第一条就提供了相应的库,大喜,用之,而事实上,正是因为自己的拿来主义,导致我后面遇到了各种莫名奇妙的问题,在执行jpeg_wirte_scanlines()和jpeg_finish_compress()时出现"写入位置发生访问冲突",由于是编译好的lib库,无法单步调试到相关函数里面检查错误,这个问题让人很绝望。
网上google时,无意找到了Compile LibJPEG看看,似乎编译过程也并不复杂,报着最后一丝希望,决定自己编译下libjpeg。该文已经将编译过程写得很详细了,我在windows7下编译也没有任何问题。下面我做一个简单的翻译。
1.1 从 http://www.ijg.org/files/上下载jpegsrc.v6b.tar.gz。
1.2 解压,假设我们放在C:\temp\jpegsrc.v6b下。
1.3 重命名c:\jpegsrc.v6b\jpeg-6b\makefile.vc 为 c:\jpegsrc.v6b\jpeg-6b\Makefile。
1.4 重命名c:\jpegsrc.v6b\jpeg-6b\jconfig.vc 为 c:\jpegsrc.v6b\jpeg-6b\jconfig.h。
1.5 打开cmd(快捷键:win+r)
1.6 在cmd中运行如下命令。vsvars32.bat的位置可能会不同,结合自己情况修改。注意:""不能少
"C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
cd C:\temp\jpegsrc.v6b\jpeg-6b
nmake -f Makefile
1.7 编译成功后,在C:\temp\jpegsrc.v6b\jpeg-6b下会生成一个libjpeg.lib文件
1.8 对C:\temp\jpegsrc.v6b\jpeg-6b\jmorecfg.h进行修改:
/* INT32 must hold at least signed 32-bit values. */
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
typedef long INT32;
#endif
and make it look like this:
// INT32 must hold at least signed 32-bit values.
//#ifndef XMD_H // X11/xmd.h correctly defines INT32
#if !defined( XMD_H ) && !defined( WIN32 )
typedef long INT32;
#endif
1.9 对C:\temp\jpegsrc.v6b\jpeg-6b\jmorecfg.h进行修改:
#ifdef NEED_FAR_POINTERS
#define FAR far
#else
#define FAR
#endif
and make it look like this:
#ifdef NEED_FAR_POINTERS
#define FAR far
#else
#undef FAR // Added by Linden Lab to remove warnings
#define FAR
#endif
1.10 将
"jconfig.h"
"jerror.h"
"jinclude.h"
"jmorecfg.h"
"jpeglib.h"
以及
jpegliblib
添加到你的vs2008工程文件中
2. 使用libjpeg
由于libjpeg是C语言写的,在包含jpeglib.h时需要加上
extern "C" {
#include "jpeglib.h"
}
3. 部分源代码
[align=left]#include <windows.h>[/align] [align=left] [/align] [align=left]extern "C"{[/align] [align=left]#include <libavcodec/avcodec.h>[/align] [align=left]#include <libavformat/avformat.h>[/align] [align=left]#include <libswscale/swscale.h>[/align] #include "jpeglib.h" // for jpeglib [align=left]};[/align] [align=left] [/align] [align=left]//实现视频帧的jpeg压缩[/align] [align=left]void saveAsJpeg(AVFrame *pFrameRGB, int width, int height, int framenum)[/align] [align=left]{[/align] [align=left] char fname[128];[/align] [align=left] // AVPicture my_pic ;[/align] [align=left] struct jpeg_compress_struct cinfo;[/align] [align=left] struct jpeg_error_mgr jerr;[/align] [align=left] JSAMPROW row_pointer[1];[/align] [align=left] int row_stride;[/align] [align=left] uint8_t *buffer;[/align] [align=left] FILE *fp = NULL;[/align] [align=left] [/align] [align=left] buffer = pFrameRGB->data[0];[/align] [align=left] [/align] [align=left] int size = sizeof(buffer);[/align] [align=left] [/align] [align=left] cinfo.err = jpeg_std_error(&jerr);[/align] [align=left] jpeg_create_compress(&cinfo);[/align] [align=left] [/align] [align=left] //_snprintf(fname, sizeof(fname), "frames%d.jpg", framenum);[/align] [align=left] sprintf(fname, "frames%d.jpg", framenum);[/align] [align=left] fp = fopen(fname, "wb");[/align] [align=left] [/align] [align=left] if (fp == NULL)[/align] [align=left] return;[/align] [align=left] [/align] [align=left] jpeg_stdio_dest(&cinfo, fp);[/align] [align=left] [/align] [align=left] cinfo.image_width = width;[/align] [align=left] cinfo.image_height = height;[/align] cinfo.input_components = 3; [align=left] cinfo.in_color_space = JCS_RGB;[/align] [align=left] [/align] [align=left] jpeg_set_defaults(&cinfo);[/align] [align=left] [/align] jpeg_set_quality(&cinfo, 80, true); [align=left] [/align] [align=left] jpeg_start_compress(&cinfo, TRUE);[/align] [align=left] [/align] row_stride = width * 3; [align=left] [/align] [align=left] while (cinfo.next_scanline < height)[/align] [align=left] {[/align] [align=left] /* jpeg_write_scanlines expects an array of pointers to scanlines.[/align] [align=left] * Here the array is only one element long, but you could pass[/align] [align=left] * more than one scanline at a time if that's more convenient.[/align] [align=left] */[/align] [align=left] row_pointer[0] = &buffer[cinfo.next_scanline * row_stride];[/align] jpeg_write_scanlines(&cinfo, row_pointer, 1); [align=left] }[/align] [align=left] [/align] [align=left] jpeg_finish_compress(&cinfo);[/align] [align=left] fclose(fp);[/align] [align=left] jpeg_destroy_compress(&cinfo);[/align] printf("compress %d frame finished!\n",framenum) ; [align=left] return ;[/align] [align=left] [/align] [align=left]}[/align] |
相关文章推荐
- ffmpeg将一个视频文件解码输出bmp和jpg文件--重写tutorial01程序
- ffmpeg 重写tutorial01程序--将一个视频文件解码输出ppm文件或bmp文件
- ffmpeg实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序
- ffmpeg解码视频存为BMP文件
- ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)
- ffmpeg 实现转码一个普通视频文件为视频mpeg4,音频mp3的功能的程序(摘)
- 【转】ffmpeg解码含有B帧的视频文件的输出顺序
- [学习笔记]基于ffmpeg的视频解码,输出YUV图像到文件。
- ffmpeg解码视频保存为BMP文件
- ffmpeg解码视频存为BMP文件
- ffmpeg解码视频存为BMP文件
- 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
- ffmpeg+sdl教程----编写一个简单的播放器2(输出视频到屏幕)
- 关于ffmpeg 的总结(一个linux 下 集 屏幕录像录音,音频视频转换,合并音频视频文件,格式转换于一身的命令)
- ffmpeg对视频文件进行解码的大致流程
- Java程序运行结果输出到一个文件中去,结果显示乱码
- MFC中怎样读取一个JPG文件或BMP位图文件
- 一个简单的读取bmp文件的程序(c)
- 基于ffmpeg-1.1的视频解码并输出到LCD显示
- S3C6410处理器硬解视频文件评测(附测试版解码程序下载)