本文转自:http://blog.csdn.net/cai6811376/article/details/51774467

EasyDarwin一直坚持开源精神,所以我们着手把EasyDarwin中使用的非开源工具替换为开源项目。

我们将EasyCMS中使用的图片保存替换为FFmpeg。(这里说明Windows版)

  • 首先到ffmpeg官网下载编译好的ffmpeg文件

下载页面:https://ffmpeg.zeranoe.com/builds/

Shared包含.dll文件,Dev包含.h和.lib文件

将.h/.lib/.dll引入EasyDarwin工程

.h放入EasyDarwin/Include/FFmpeg下

.lib放入EasyDarwin/Lib/FFmpeg/x86下

.dll放入EasyDarwin/Bin/FFmpeg/x86下

  • 编写DecoderHelper类

DecoderHelper.h

#ifndef _DECODER_HELPER_
#define _DECODER_HELPER_ #define __STDC_CONSTANT_MACROS extern "C"
{
#include <inttypes.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
#include "libavutil/imgutils.h"
#include "libswresample/swresample.h"
#include "libswscale/swscale.h"
} class DecoderHelper
{
public:
DecoderHelper();
~DecoderHelper(); int SetVideoDecoderParam(int width, int height, int codec, int format);
int DecodeVideo(char *inBuff, int inBuffSize, void *yuvBuff, int width, int height); private:
void releaseVideoDecoder(); private:
AVFormatContext* _formatContext;
AVCodecContext* _videoCodecContext;
AVFrame* _videoFrame420; struct SwsContext* _swsContext;
uint8_t* _buffYUV420;
AVPacket _videoAVPacket; uint8_t* _buffYUV;
AVFrame* _avframeYUV; AVFrame* _avframeSWS; int _codec;
int _width;
int _height;
int _outputFormat; }; #endif //_DECODER_HELPER_

DecoderHelper.cpp

#include "DecoderHelper.h"

DecoderHelper::DecoderHelper()
: _formatContext(NULL),
_videoCodecContext(NULL),
_videoFrame420(NULL),
_buffYUV420(NULL),
_buffYUV(NULL),
_avframeYUV(NULL),
_avframeSWS(NULL),
_swsContext(NULL),
_codec(0),
_width(0),
_height(0),
_outputFormat(0)
{
//Register all the codec
avcodec_register_all();
//Register all types of decoding
av_register_all();
} DecoderHelper::~DecoderHelper()
{
releaseVideoDecoder();
} int DecoderHelper::SetVideoDecoderParam(int width, int height, int codec, int format)
{
if (_width != width || _height != height || _codec != codec)
{
releaseVideoDecoder();
} if (NULL != _videoCodecContext)
{
return -1;
} AVCodec *avcodec = avcodec_find_decoder((AVCodecID)codec);
if (NULL == avcodec)
{
return -1;
} _videoCodecContext = avcodec_alloc_context3(avcodec);
_videoCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
_videoCodecContext->width = width;
_videoCodecContext->height = height; int ret = avcodec_open2(_videoCodecContext, avcodec, NULL);
if (ret < 0)
{
goto $fail;
} int numBytes = avpicture_get_size(AV_PIX_FMT_YUV420P, width, height);
_buffYUV420 = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));
_videoFrame420 = av_frame_alloc();
if (avpicture_fill((AVPicture *)_videoFrame420, _buffYUV420, AV_PIX_FMT_YUV420P,
_width, _height) < 0)
{ } av_init_packet(&_videoAVPacket);
_width = width;
_height = height;
_codec = codec;
_outputFormat = format; return 0; $fail:
{
return -1;
} } int DecoderHelper::DecodeVideo(char *inBuff, int inBuffSize, void *yuvBuff, int width, int height)
{
if (NULL == inBuff) return -1;
if (1 > inBuffSize) return -1;
if (NULL == yuvBuff) return -1;
if (NULL == _videoCodecContext) return -2; _videoAVPacket.size = inBuffSize;
_videoAVPacket.data = (uint8_t*)inBuff; int frameFinished = 0;
int nDecode = avcodec_decode_video2(_videoCodecContext, _videoFrame420, &frameFinished, &_videoAVPacket);//(uint8_t*)pInBuffer, inputSize);
if (nDecode < 0) return -3;
if (!frameFinished) return -4; if (width != _width || height != _height)
{
if (NULL != _avframeYUV)
{
av_frame_free(&_avframeYUV);
_avframeYUV = NULL;
} if (NULL != _swsContext)
{
sws_freeContext(_swsContext);
_swsContext = NULL;
} _width = width;
_height = height;
} if (NULL == _avframeYUV)
{
int numBytes = avpicture_get_size((AVPixelFormat)_outputFormat, width, height);
_avframeYUV = av_frame_alloc();
}
if (NULL == _avframeYUV) return -5; if (avpicture_fill((AVPicture *)_avframeYUV, (uint8_t*)yuvBuff, (AVPixelFormat)_outputFormat,
width, height) < 0)
{
return -1;
} if (NULL == _swsContext)
{
_swsContext = sws_getCachedContext(_swsContext, _videoCodecContext->width, _videoCodecContext->height, (AVPixelFormat)AV_PIX_FMT_YUV420P,
width, height, (AVPixelFormat)_outputFormat, SWS_BICUBIC, NULL, NULL, NULL);
}
if (NULL == _swsContext) return -1; int ret = sws_scale(_swsContext, _videoFrame420->data, _videoFrame420->linesize, 0, _videoCodecContext->height,
_avframeYUV->data, _avframeYUV->linesize); return 0;
} void DecoderHelper::releaseVideoDecoder()
{
if (NULL != _videoFrame420)
{
av_frame_free(&_videoFrame420);
_videoFrame420 = NULL;
}
if (NULL != _buffYUV420)
{
av_free(_buffYUV420);
_buffYUV420 = NULL;
}
if (NULL != _avframeSWS)
{
av_frame_free(&_avframeSWS);
_avframeSWS = NULL;
}
if (NULL != _avframeYUV)
{
av_frame_free(&_avframeYUV);
_avframeYUV = NULL;
}
if (NULL != _buffYUV)
{
av_free(_buffYUV);
_buffYUV = NULL;
} if (NULL != _swsContext)
{
sws_freeContext(_swsContext);
_swsContext = NULL;
} if (NULL != _videoCodecContext)
{
avcodec_close(_videoCodecContext);
av_free(_videoCodecContext);
_videoCodecContext = NULL;
}
}
  • 使用
DecoderHelper decoderHelper;
decoderHelper.SetVideoDecoderParam();
decoderHelper.DecodeVideo();

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

QQ交流群:288214068

Copyright © EasyDarwin.org 2012-2015

EasyDarwin接入ffmpeg实现264转图片快照功能的更多相关文章

  1. PDF文档工具:pdfFactory快照功能详解

    pdfFactory的快照功能,是通过一种类似截图的方式,将文档中的内容,如标题.图片.段落.文字等进行剪切的功能.剪切后的内容会转化为文本框的形式,我们可以对其进行加边框.旋转等编辑处理,但不能对其 ...

  2. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  3. C# 图片盖章功能实现,支持拖拽-旋转-放缩-保存

    实现图片盖章功能,在图片上点击,增加“图章”小图片,可以拖拽“图章”到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加“图章”2.选中移动图标3.点中右下角放缩旋 ...

  4. 杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

    在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作.可能是我的设置问题,也可能是Sha ...

  5. jQuery.YesShow - 图片轮播插件(带图片放大功能)

    jQuery.YesShow - 图片轮播插件(带图片放大功能) 使用简单,原文件只要这样就可以了:<div id="yes">         <ul> ...

  6. 纯JS实现图片验证码功能并兼容IE6-8

    最近要搞一个图片验证码功能,但是又不想自己写后台代码.于是自己准备搞一个纯前端的验证码功能,于是网上搜索了一下,找到一个插件gVerify.js,简单好用,实现完美.不过后面接到说要兼容IE8,想想也 ...

  7. VirtualBox的快照功能

    VirtualBox是非常好用的一个虚拟机软件,无论是性能还是易用性不比商用的Vmware差.VirtualBox最初是Sun公司的产品,由于Sun被Oracle收购,现在也归Oracle了.除了虚拟 ...

  8. 图片放大功能如何做?jquery实现

    花了很长时间撸了个网站,观点,其中需要一个图片放大功能,网上找了半天发现都没有中意的,最后无奈之下自己写了一个,演示地址,演示图片: 自我感觉效果还不错,现在分享开来给大家看看,哪里不好还请多多指教, ...

  9. Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能

    Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...

随机推荐

  1. jQuery控件之分页控件-- kkpager v1.3使用简介

    js分页展示控件,传入简单参数就能使用的分页效果控件 在线测试链接: http://pgkk.github.io/kkpager/example/pager_test.html http://pgkk ...

  2. UML学习倒腾记

    先看到http://www.jianshu.com/p/1256e2643923这篇博客,号称21分钟入门uml,也许是我太笨了吧,一下午也没有完全搞定: 使用过atom编辑器,没有完全运行出来结果. ...

  3. bq25896 IINDPM 及 無 IINDPM 時的 regsiter

      無 IINDPM status 有 IINDPM status   [bq25890 reg@][0x0]=0x5d[0x1]=0x6[0x2]=0x91[0x3]=0x1a[0x4]=0x8[0 ...

  4. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

  5. hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流

    River Problem 题意:一个有向树(河流),只有一个汇点1,每条边只有一个出度.有些河道有污染指数xi,必需要治理,有m段路径,可以去覆盖这些,每被覆盖一次,xi降低响应值. :即 给出一些 ...

  6. 微信小程序踩坑之一[wx.request]请求模式

    最近在做小程序时,使用wx.request()方法请求时, 当使传输string类型时,一定要声明method请求模式为post,否则会一直报错,而不声明时默认为get, 已填坑 =,= wx.req ...

  7. ie下li标签中span加float:right不换行问题解决方案

    在IE6,IE7下使用标签时,在加入右浮动样式(float:right)后,会换行的bug解决方案:bug案例:新闻列表中,为使时间右对齐,加右浮动产生换行 <ul> <li> ...

  8. JDBC_完整版

    1,新建WEB项目:JDBC 2,导入驱动 将mysql-connector-java-5.0.8-bin.jar包放入web-inf目录下面的lib目录中 3,新建User类,放入entity包中 ...

  9. GitBook一个专注于帮助文档的工具

    官网:https://www.gitbook.com GitHub组织:https://github.com/gitbookio GitBook一个专注于帮助文档的工具,比如: 1.简单的左侧列表右侧 ...

  10. 管理SQL Server监控

    http://blog.csdn.net/DBA_Huangzj/article/category/1133081 http://www.cnblogs.com/bhtfg538/archive/20 ...