转:ffmpeg压缩视频示例

#ifndef   RECORD_H 
#define   RECORD_H

#include   "avcodec.h " 
#include   "avformat.h "

#include   <stdio.h>

class   QRecord 

public: 
static   int   Open(const   char   *,int,int,int); 
static   int   AddFrame(unsigned   char*,unsigned   char*,unsigned   char*); 
static   int   Close();

static   AVCodecContext   *c; 
        static   int   out_size,   outbuf_size; 
        static   FILE   *f; 
        static   AVFrame   *picture; 
        static   uint8_t   *outbuf; 
};

#endif

================================

#include   "Record.h "

#include   <stdlib.h>

AVCodecContext   *QRecord::c=NULL; 
int   QRecord::out_size,   QRecord::outbuf_size; 
FILE   *QRecord::f; 
AVFrame   *QRecord::picture; 
uint8_t   *QRecord::outbuf;

int   QRecord::Open(const   char   *filename,int   width,int   height,int   frame_rate) 

AVCodec   *codec;

av_register_all();

codec   =   avcodec_find_encoder(CODEC_ID_MPEG1VIDEO); 
        if   (!codec)   { 
fprintf(stderr,   "codec   not   found\n "); 
                return   -1; 
        }

c=   avcodec_alloc_context(); 
        picture=   avcodec_alloc_frame(); 
        
        /*   put   sample   parameters   */ 
        c-> bit_rate   =   400000; 
        /*   resolution   must   be   a   multiple   of   two   */ 
        c-> width   =   width;     
        c-> height   =   height; 
        /*   frames   per   second   */ 
        c-> frame_rate   =   frame_rate;     
        c-> frame_rate_base=   1; 
        c-> gop_size   =   10;   /*   emit   one   intra   frame   every   ten   frames   */ 
        c-> max_b_frames=1;

/*   open   it   */ 
        if   (avcodec_open(c,   codec)   <   0)   { 
                fprintf(stderr,   "could   not   open   codec\n "); 
                return   -1; 
        } 
        
        /*   the   codec   gives   us   the   frame   size,   in   samples   */

f   =   fopen(filename,   "w "); 
        if   (!f)   { 
                fprintf(stderr,   "could   not   open   %s\n ",   filename); 
                return   -1; 
        } 
        
        /*   alloc   image   and   output   buffer   */ 
        outbuf_size   =   1000000;//? 
        outbuf   =(uint8_t*)   malloc(outbuf_size); 
        //size   =   c-> width   *   c-> height; 
        //picture_buf   =(uint8_t*)   malloc((size   *   3)   /   2);   /*   size   for   YUV   420   */

picture-> linesize[0]   =   c-> width; 
        picture-> linesize[1]   =   c-> width   /   2; 
        picture-> linesize[2]   =   c-> width   /   2;

return   0; 
}

int   QRecord::AddFrame(unsigned   char   *y,unsigned   char   *u,unsigned   char   *v) 

        picture-> data[0]   =   y; 
        picture-> data[1]   =   u; 
        picture-> data[2]   =   v;

out_size   =   avcodec_encode_video(c,   outbuf,   outbuf_size,   picture); 
//printf( "encoding   frame   %3d   (size=%5d)\n ",   i,   out_size); 
fwrite(outbuf,   1,   out_size,   f);

return   0; 
}

int   QRecord::Close() 

while(out_size)   { 
out_size   =   avcodec_encode_video(c,   outbuf,   outbuf_size,   NULL); 
//printf( "write   frame   %3d   (size=%5d)\n ",   i,   out_size); 
fwrite(outbuf,   1,   out_size,   f); 
}

/*   add   sequence   end   code   to   have   a   real   mpeg   file   */ 
outbuf[0]   =   0x00; 
outbuf[1]   =   0x00; 
outbuf[2]   =   0x01; 
outbuf[3]   =   0xb7; 
fwrite(outbuf,   1,   4,   f); 
fclose(f); 
free(outbuf);

avcodec_close(c); 
free(c); 
free(picture); 
//printf( "\n ");

return   0; 
}

============================================

使用ffmpeg的库编码mpeg的技术总结报告 
Sun   Gang,   2003-11-21

一   .   概述 
Ffmpeg是一个优秀的基于LGPL协议的视频/音频转换器.目前已经有很多多媒体应用软件使用它来作为编码器,如Xine,Mplayer,Xbox   Media   Player等.它也能用于从视频/音频源来抓取数据保存为视频音频文件.Ffmpeg还能从各种采样率来开始转换,能够通过高品质的多相滤波技术来实现放大缩小,频域相域的变换等. 
这里,我们使用Ffmpeg来实现mpeg的编码过程. 
二   .   摄像头的视频捕捉调用相关说明(即使用Video4Linux   API获取图象的调用说明) 
#include   <videodev.h> 
struct   video_window   vid_win; 
struct   video_capability   vid_caps; 
struct   video_picture   vid_pic; 
struct   video_mbuf   mbuf;

1.   打开设备 
int   dev   =   open( "/dev/video0 ",O_RDWR);

2.   获取相关参数 
ioctl   (dev,   VIDIOCGCAP,   &vid_caps); 
ioctl   (dev,   VIDIOCGWIN,   &vid_win); 
ioctl   (dev,   VIDIOCGPICT,   &vid_pic);

//Check   to   see   if   we   can   use   mmap 
if(0   ==   ioctl(dev,VIDIOCGMBUF,&mbuf))...;

//Check   to   see   if   this   camera   uses   MJPEG 
if(vid_caps.type   &   VID_TYPE_MJPEG_ENCODER)...;

3.   设置相关参数 
ioctl(dev,   VIDIOCSPICT,   &vid_pic); 
ioctl(dev,   VIDIOCSWIN,     &vid_win);

4.   获取图象数据 
read   (dev,   picbuff,   size); 
//至此,图象数据存放在picbuff中 
三   .   QRecord编码接口说明(编码为MPEG1   System   format,   其中视频采用mpeg1video,   音频采用MP2) 
定义如下 
class   QRecord 

public: 
//encode   mpeg1   file   with   ffmpeg   library 
static   int   audio_input_frame_size; 
static   AVOutputFormat   *fmt; 
static   AVFormatContext   *oc; 
static   AVStream   *audio_st,*video_st; 
static   int   Open(const   char*   filename,int   width,int   height,int   frame_rate,bool   audio_on=false); 
static   int   AddVideoFrame(uint8_t*   y,uint8_t*   u,uint8_t*   v); 
static   int   AddAudioFrame(int16_t*   inbuf); 
static   int   Close();

//for   decompress   Jpeg 
static   int   DecompressJpeg(const   char*   input,unsigned   char*   rgbbuffer); 
//for   rgb2yuv   convert 
static   int   count   ; 
static   float   RGBYUV02990[256],   RGBYUV05870[256],   RGBYUV01140[256]; 
static   float   RGBYUV01684[256],   RGBYUV03316[256]; 
static   float   RGBYUV04187[256],   RGBYUV00813[256]; 
static   void   InitRGB2YUVLookupTable(); 
static   int   RGB2YUV   (int   x_dim,   int   y_dim,   void   *bmp,   void   *y_out,   void   *u_out,   void   *v_out,   int   flip);

static   int   add_scanline_to_rgbbuffer(unsigned   char*   linebuffer,int   length,unsigned   char*   rgbbuffer); 
}; 
几个重要接口函数说明, 
QRecord::Open()   打开要存储文件,并初始化各项参数 
QRecord::AddVideoFrame()增加一帧视频数据,格式为YUV420P, 
QRecord::AddAudioFrame()增加一帧音频数据,格式为44.1KHz,16bits,2channels   PCM   data 
QRecord::Close()关闭文件,释放内存等.

四   .   编码速度测试报告 
测试数据为25张320X240,RGB24的图片文件,编码1000帧的各自需要时间如下: 
VIA   Cyrix   1G,   96M   ram为   39-42秒 
Intel   PIII-M   800M,   128M   ram   为6秒 
Intel   PIII   550M,128M   ram为10   秒.

时间: 2024-10-28 16:35:27

转:ffmpeg压缩视频示例的相关文章

Java使用FFmpeg处理视频文件指南

Java使用FFmpeg处理视频文件指南 本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取.码率压缩.分辨率转换等功能: 之前在网上浏览了一大圈Java使用FFmpeg处理音视频的文章,大多都讲的比较简单,楼主在实操过程中踩了很多坑也填了很多坑,希望这份详细的踩坑&填坑指南能帮助到大家: 1. 什么是FFmpeg 点我了解 2. 开发前准备 在使用Java调用FFmpeg处理音视频之前,需要先安装FFmpeg,安装方法分为两种: 引入封装了FFmpeg的开源框架 在系统中手

C#使用FFmpeg 将视频格式转换成Gif图片示例

一.本次使用参数说明 /* * 参数说明: * -i 源文件位置 * -y 输出新文件,是否覆盖现有文件 * -s 视频比例 4:3 320x240/640x480/800x600 16:9 1280x720 ,默认值 'wxh',和原视频大小相同 * -f 等同'-formats',定义的可支持的文件格式'ffmpeg-formats',更多参考:https://ffmpeg.org/ffmpeg-formats.html * -vframes 数字类型,指定视频输出帧数 * -dframes

使用ffmpeg合并视频文件的三种方法

ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是:视频容器是MPEG-1, MPEG-2 PS或DV等可以直接进行合并的.换句话说,其实可以直接用cat或者copy之类的命令来对视频直接进行合并.很多文章介绍了这种方法,但适用性却没有提及.这并不是一个通用的方法.典型的命令示例如下: ffmpeg -i concat:"intermediate1

使用ffmpeg 对视频截图,和视频转换格式

//执行CMD命令方法 public static void CmdProcess(string command)//调用CMD        {            //实例化一个进程类            Process process = new Process();            process.StartInfo.FileName = "cmd.exe"; //将cmd的标准输入和输出全部重定向到.NET的程序中            process.StartI

FFmpeg:视频转码、剪切、合并、播放速调整

原文:https://fzheng.me/2016/01/08/ffmpeg/ FFmpeg:视频转码.剪切.合并.播放速调整 2016-01-08 前阵子帮导师处理项目 ppt,因为插入视频的格式问题被搞得焦头烂额.Windows 内置解码器不够全,PowerPoint 原生支持的内嵌视频格式有限.更麻烦的是新版本的 PowerPoint 支持的格式(比如 MPEG4 编码的 .mp4)旧版本还不支持,而你对手头的 ppt 即将播放的场所用什么系统什么版本的软件又无能为力,所以最稳妥的方式是,

php使用ffmpeg向视频中添加文字字幕

这篇文章主要介绍了PHP使用ffmpeg给视频增加字幕显示的方法,实例分析了php操作ffmpeg给视频增加字母的技巧,具有一定参考借鉴价值,需要的朋友可以参考下. 本文实例讲述了PHP使用ffmpeg给视频增加字幕显示的方法.分享给大家供大家参考.具体实现方法如下: <?php $dir = './'; // set to current folder if ($handle = opendir($dir)) { while(false!== ($file = readdir($handle)

使用ffmpeg转换视频格式

命令: ffmpeg -i infile -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 6 -y outfile 说明: infile:要转换的文件路径 outfile:转换到的文件路径 参考:http://ferreousbox.iteye.com/blog/163865 ffmpeg下载:http://dl.pconline.com.cn/download/53703.html 使用ffmpeg转换视频格式,布布扣,b

多线程简易售票程序--孙鑫视频示例

孙鑫视频多线程的第一个例子----简易的售票程序 #include <Windows.h> #include <iostream> int ticket = 100; //定义互斥对象 /* 互斥对象属于内核对象,它能够准确保证线程拥有对单个资源的互斥访问 互斥对象包含一个使用数量 线程ID 计数器 ID用于标识系统中哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数 */ HANDLE hMutex; DWORD WINAPI FunProc_1(LPVOID lp

ffmpeg显示视频

项目最近需要实现播放视频功能,这个在上家公司就做过.虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此.在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成.然而在播放dvr录制的视频文件时,发现播放帧率不对,分析发现是dvr存储的视频文件不是按标准格式进行存储(使用ffplay效果还好点,media player根本没法播放),于是重写代码. 先简要说明一下项目:client是delphi开发的GUI程序,视频所有操作功能都由mfc dll实现,这个