ffmpeg 重写tutorial01程序--将一个视频文件解码输出bmp和jpg文件

原创 2012年03月22日 16:43:07
参考链接1:Compile LibJPEG
参考链接2:利用ffmpeg0.5 和libjpeg实现抽取视频帧并将其保存为jpeg文件格式程序
参考链接3:ffmpeg 重写tutorial01程序--将一个视频文件解码输出ppm文件或bmp文件

之前写过一个将视频文件解码输出bitmap文件(见参考链接3),由于项目需要,需要输出jpg文件,由于jpg格式是有损压缩的,比bmp格式要复杂许多,简单google下,libjpeg开源库正合我意,使用起来简单清晰,网上很多朋友提供了很好的例子,我在windows7下编译花费了较多的时间。

操作系统: windows 7 旗舰版
开发环境:vs2008
相关库:ffmpeg,libjpeg

vs工程文件

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. 部分源代码
#include <windows.h>

extern "C"{
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include "jpeglib.h" // for jpeglib
};

//实现视频帧的jpeg压缩
void saveAsJpeg(AVFrame *pFrameRGBint widthint heightint framenum)
{
      char fname[128];
      // AVPicture my_pic ;
      struct jpeg_compress_struct cinfo;
      struct jpeg_error_mgr jerr;
      JSAMPROW row_pointer[1];
      int row_stride;
      uint8_t *buffer;
      FILE *fp = NULL;

      buffer = pFrameRGB->data[0];

      int size = sizeof(buffer);

      cinfo.err = jpeg_std_error(&jerr);
      jpeg_create_compress(&cinfo);

      //_snprintf(fname, sizeof(fname), "frames%d.jpg", framenum);
      sprintf(fname"frames%d.jpg"framenum);
      fp = fopen(fname"wb");

      if (fp == NULL)
            return;

      jpeg_stdio_dest(&cinfofp);

      cinfo.image_width = width;
      cinfo.image_height = height;
      cinfo.input_components = 3;
      cinfo.in_color_space = JCS_RGB;

      jpeg_set_defaults(&cinfo);

      jpeg_set_quality(&cinfo, 80, true);

      jpeg_start_compress(&cinfoTRUE);

      row_stride = width * 3;

      while (cinfo.next_scanline < height)
      {
            /* jpeg_write_scanlines expects an array of pointers to scanlines.
            * Here the array is only one element long, but you could pass
            * more than one scanline at a time if that's more convenient.
            */
            row_pointer[0] = &buffer[cinfo.next_scanline * row_stride];
            jpeg_write_scanlines(&cinforow_pointer, 1);
      }

      jpeg_finish_compress(&cinfo);
      fclose(fp);
      jpeg_destroy_compress(&cinfo);
      printf("compress %d frame finished!\n",framenum) ;
      return ;

}












ffmpeg将一个视频文件解码输出bmp和jpg文件--重写tutorial01程序

URL:http://blog.csdn.net/ajaxhe/article/details/7383800 参考链接1:Compile LibJPEG http://w3studi.i...
  • czc1009
  • czc1009
  • 2013年11月16日 09:49
  • 1489

ffmpeg 重写tutorial01程序--将一个视频文件解码输出ppm文件或bmp文件

原文链接:http://dranger.com/ffmpeg/tutorial01.html 这个链接是一个很好的FFmpeg入门教程,但原文中的代码随着FFmpeg版本不断更新,部分API已经被替...
  • ajaxhe
  • ajaxhe
  • 2012年03月10日 19:49
  • 1360

ffmpeg(7):将h264编码的视频流保存为BMP或者JPEG图片

一般我们知道播放视频流的时候是有截图功能的。 所以我想是否可以将视频流保存为BMP或者JPEG 参考: 1.最简单的基于FFMPEG的图像编码器(YUV编码为JPEG) http://...
  • oldmtn
  • oldmtn
  • 2015年07月03日 16:09
  • 15288

通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)

参考http://hi.baidu.com/mingxin505/item/52d6d1cda805d925a0b50a57,将其改为linux下可编译运行。可实现YUV420P与RGB32的互转。 ...
  • flyfight88
  • flyfight88
  • 2013年01月25日 15:14
  • 6101

ffmpeg解码JPG和PNG等图片

http://blog.chinaunix.net/uid-25272011-id-3690729.html  【特别提醒:本文写作时,贴上去的代码,"\n"回车符号的"\"没有了,不知道为啥,所以...
  • nimeghbia
  • nimeghbia
  • 2017年08月07日 16:00
  • 440

使用 FFmpeg 开发播放器基础--使用 ffmpeg 解码视频文件

原:http://blog.chinaunix.net/uid-11344913-id-4282729.html 使用 ffmpeg 解码多媒体文件之前,首先需要了解一些基本的概念: 容器:多媒体...
  • qq_16209077
  • qq_16209077
  • 2016年07月21日 00:27
  • 14756

python script----BMP 2 JPG

知道了CImage类,发现其实也是一样的!不过还是喜欢脚本,灵活,方便,简洁! 从今天起,我彻底的爱上了python!今天从网上下了些图片,结果保存成的是bmp格式!!不喜欢,我想把它们转成jpg格式...
  • s91
  • s91
  • 2006年02月14日 17:47
  • 1963

ffmpeg命令行jpg转png出错求助

大家好,我想把jpg图片转成png,命令如下: ffmpeg -i a.jpg a.png 然后ffmpeg显示如下: /usr/local/lib/libavfilter.so.3: s...
  • vbLittleBoy
  • vbLittleBoy
  • 2014年02月20日 15:48
  • 1677

将jpg图像转换成yuv420p格式

python实现的将图片从jpg转为yuv420p的代码
  • smallflyingpig
  • smallflyingpig
  • 2017年02月23日 23:02
  • 1657

[学习笔记]基于ffmpeg的视频解码,输出YUV图像到文件。

虽然在音视频领域工作了一段时间,但是对于ffmpeg还是比较陌生,从这周开始入手学习。 拜读了雷霄骅的《最简单的基于FFMPEG+SDL的视频播放器 ver2》,受益匪浅,链接如下 http...
  • qq_32430349
  • qq_32430349
  • 2015年11月06日 14:49
  • 2337
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ffmpeg 重写tutorial01程序--将一个视频文件解码输出bmp和jpg文件
举报原因:
原因补充:

(最多只允许输入30个字)