php视频转换扩展ffmpeg+mencode参数说明及使用经验

转载来的文章
2、ffmpeg最新版本的下载地址:http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下载地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/
3、转换速度比较:总体上ffmpeg转换的速度快于Mencoder
4、转换格式要求:rm、rmvb、rt、swf格式的文件只能用Mencoder转换。
5、纯音频格式只能用Mencoder进行转换。如何判断是否是纯音频格式可以通过使用命令 FFmpeg -i “文件的完整路径” 获得输出后就可以分析出来。
6、.mov格式的用ffmpeg转换出来的效果比较差,建议用Mencoder进行转换,wmv8用ffmpeg经常会有花屏产生建议用Mencoder。
7、视频按比率输出的问题:必须先获取源视频文件的宽度和高度(也是通过 FFmpeg -i “文件的完整路径” 获得输出后就可以分析出来)根据这个高度和宽度的比率来设定输出文件的尺寸。
8、可能的难点:因为这ffmpeg 和 Mencoder都是命令行工具(当然你也可以下载源代码自己修改成com之类的),在C#只能用Process调用,前面我提过要获得输出信息(获取视频相关信息、获取当前的转换进度、获取什么时候完成转换),必须设置process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true;然后必须通过异步编程的方式获取Process.StandardOutput和Process.StandardError的值,相关说明可以见(ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemDiagnosticsProcessClassStandardOutputTopic.htm)(必须安装了msdn的才能看)。
ffmpeg.exe -i F:\娱乐\动力之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\11.flv
ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\test.flv
使用-ss参数 作用(time_off set the start time offset),可以从指定时间点开始转换任务。如:
转换文件格式的同时抓缩微图:
ffmpeg -i “test.avi” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’
对已有flv抓图:
ffmpeg -i “test.flv” -y -f image2 -ss 8 -t 0.001 -s 350×240 ‘test.jpg’
-ss后跟的时间单位为秒
Ffmpeg转换命令
ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176×144 -acodec aac -ac 2 -ar 22500
-ab 24 -f 3gp test.3gp
或者
ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176×144 -b 128 -r 15 test.3gp

ffmpeg参数设定解说
-bitexact 使用标准比特率
-vcodec xvid 使用xvid压缩
-s 320×240 指定分辨率
-r 29.97 桢速率(可以改,确认非标准桢率会导致音画不同步,所以只能设定为15或者29.97)
画面部分,选其一
-b 指定压缩比特率,似乎ffmpeg是自动VBR的,指定了就大概是平均比特率,比如768,1500这样的
就是原来默认项目中有的
-qscale 以质量为基础的VBR,取值0.01-255,约小质量越好
-qmin 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同样的质量
声音部分
-acodec aac 设定声音编码
-ac 设定声道数,1就是单声道,2就是立体声,转换单声道的TVrip可以用1(节省一半容量),高品质
的DVDrip就可以用2
-ar 设定声音采样率,PSP只认24000
-ab 设定声音比特率,前面-ac设为立体声时要以一半比特率来设置,比如192kbps的就设成96,转换
君默认比特率都较小,要听到较高品质声音的话建议设到160kbps(80)以上
-vol 设定音量,某些DVDrip的AC3轨音量极小,转换时可以用这个提高音量,比如200就是原来的2倍
这样,要得到一个高画质音质低容量的MP4的话,首先画面最好不要用固定比特率,而用VBR参数让程序自己去
判断,而音质参数可以在原来的基础上提升一点,听起来要舒服很多,也不会太大(看情况调整

例子:ffmpeg -y -i “1.avi” -title “Test” -vcodec xvid -s 368×208 -r 29.97 -b 1500 -acodec aac -ac 2 -ar 24000 -ab 128 -vol 200 -f psp -muxvb 768 “1.mp4”
解释:以上命令可以在Dos命令行中输入,也可以创建到批处理文件中运行。不过,前提是:要在ffmpeg所在的目录中执行(转换君所在目录下面的cores子目录)。
参数:
-y(覆盖输出文件,即如果1.mp4文件已经存在的话,不经提示就覆盖掉了)
-i “1.avi”(输入文件是和ffmpeg在同一目录下的1.avi文件,可以自己加路径,改名字)
-title “Test”(在PSP中显示的影片的标题)
-vcodec xvid(使用XVID编码压缩视频,不能改的)
-s 368×208(输出的分辨率为368×208,注意片源一定要是16:9的不然会变形)
-r 29.97(帧数,一般就用这个吧)
-b 1500(视频数据流量,用-b xxxx的指令则使用固定码率,数字随便改,1500以上没效果;还可以用动态码率如:-qscale 4和-qscale 6,4的质量比6高)
-acodec aac(音频编码用AAC)
-ac 2(声道数1或2)
-ar 24000(22050 声音的采样频率,好像PSP只能支持24000Hz)
-ab 128(音频数据流量,一般选择32、64、96、128)
-vol 200(200%的音量,自己改)
-f psp(输出psp专用格式)
-muxvb 768(好像是给PSP机器识别的码率,一般选择384、512和768,我改成1500,PSP就说文件损坏了)
“1.mp4″(输出文件名,也可以加路径改文件名)
P.S. 版主机器强劲的话,可以多开几个批处理文件,让它们并行处理。
E:\ffmpeg.exe -i I:\1.wmv -b 360 -r 25 -s 320×240 -hq -deinterlace -ab 56 -ar 22050 -ac 1 D:\2.flv

mencoder的参数
mencoder的参数更加复杂,不过也无非是音频处理视频处理两个方面,可以参看网络例子:http://www.masoncn.com/pos…这里不作详细的列举了.

mencoder进行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目标视频格式] [-oac 目标音频格式] [-of 目标文件格式]

1.转换成flv文件: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
mencoder infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112

2.转换成avi文件: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600

3.转换成wmv文件(复杂写法,其中高级参数可以省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea

4.截图: mplayer infile -ss START_TIME -noframedrop -nosound -vo jpeg -frames N

其中-ovc,-oac和-of是必须的,-ovc是指定视频codec,指定了ovc之后通常带一个该codec的opt参数,-oac是指定音频codec,也会在其后带一个codec的opt参数.可以指定细节以决定视频音频质量和转换速率.具体的细节可以参看专业的技术文档.
Mencoder视频转换成flv格式

mencoder “input.avi” -o “output.flv” -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -ofps 29.97 -srate 22050

参数详解:
-o “output.flv”:是输出文件路径;
-of lavf:是输出文件格式,这里不是flv而是lavf,是因为flv属于libavformat;
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames:-lavfopts表示对lavf进行一些设置,设置的内容就是i_certify_that_my_video_stream_does_not_use_b_frames,翻译成中文就是:我确定,我的视频不用B frames,对于转换flv格式,最好加上这个参数,否则可能会报错。
-oac mp3lame:oac=output audio codec,输出音频编码器,这里用的mp3lame;
-lameopts abr:br=56:lame options,是专门针对mp3lame的参数设置,abr:br=56,是设置音频比特率为56;
-ovc lavc:ovc=output video codec,输出视频编码器,lavc表示one of libavcodec’s video codec,输出格式为libavformat之一;
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:trell:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1:对lavc进行一些设置,详细介绍如下:
vcodec=flv:指定视频编码器为flv;
vbitrate=500:指定视频比特率为500。
mbd:宏模块选择算法,值为0~2默认为0,值越大转换越缓慢,但在品质和文件大小方面有好处;
mv0:编译每个宏模块并选择最好的一个,当mbd=0时无效;
v4mv:会稍微增加品质,mbd>0时效果更明显;
trell:量子化网格搜索,对每8×8block找到最优化编码;
cbp:只能和trell一期使用,评估失真的图像块编码;
last_pred=3:与上一帧相比的移动数量预测,值为0~99,1~3比较合适,大于3时对品质的提高已经无关紧要,但却会降低速度;
dia=4:移动搜索范围,值为-99~6,对于快速转换,-1是个不错的值,如果不是很重视速度,可以考虑2~4;
cmp=6:值为1~2000,默认为0,设置用于全象素移动预算的比较函数
vb_strategy=1:对动作很大的场景会有帮助,对有些视频,设置vmax_b_frames会有损品质,加上vb_strategy=1会好点。

define("ROOT_DIR",dirname(__FILE__)); 
class EcodeFlv { 
  var $fromFile;   //上传来的文件 
  var $toFilePath;  //保存文件路径 
  var $toPicPath;  //保存图片路径 
  var $mpeg; //ffmpeg.exe文件的路径 
  var $mencode; //mencode.exe文件的路径 
  var $cmdToFile; //转换文件命令 
  var $cmdToPic;  //转换图片命令 
  var $toFileName; //转换后的文件名 
  var $mpegComm; //ffmpeg.exe的转换命令 
  var $mencodeComm; //mencode.exe的命令 
  var $mpegType;  
  var $mencodeType; 
  var $midi; //mdi.exe的路径 
  var $cmdMidi; //mdi.exe的命令 
//初始化类 
  function EcodeFlv($fromFile,$toFilePath,$toPicPath,$mpeg,$mencode,$midi) { 
   $this->mpegComm = false; 
   $this->mencodeComm = false; 
   $this->fromFile = $fromFile; 
   $this->toFilePath = $toFilePath; 
   $this->toPicPath = ROOT_DIR."/".$toPicPath; 
   $this->mpeg = ROOT_DIR.$mpeg; 
   $this->mencode = ROOT_DIR.$mencode; 
   $this->midi = ROOT_DIR.$midi; 
   $this->mpegType=array ( 
       "audio/x-mpeg"=>".mp3", 
       "video/mpeg"=>".mpeg", 
       "video/3gpp"=>".3gp", 
       "video/x-ms-asf"=>".asf", 
       "video/x-msvideo"=>".avi" 
   ); 
   $this->mencodeType = array( 
       "application/vnd.rn-realmedia"=>".rm", 
       "audio/x-pn-realaudio"=>".rmvb", 
       "audio/x-ms-wmv"=>".wmv", 
   ); 
  } 
 
//检查文件类型 
 
  function checkType() { 
    if(function_exists(mime_content_type)){ 
     return false; 
    }else{ 
     //$contentType = mime_content_type($this->fromFile); 
     $exe = "D:\server\php\extras\magic"; 
     $handel = new finfo(FILEINFO_MIME, $exe);  
     $contentType =  $handel->file($this->fromFile);  
    } 
    foreach($this->mpegType as $index=>$key){ 
     if($contentType == $index){ 
      $name = md5(date("Ymd").tiime()); 
      $this->toFileName = $name; 
      $this->$mpegComm = true; 
      return true; 
     } 
    } 
    foreach($this->mencodeType as $index=>$key){ 
      if($contentType == $index){ 
      $name = md5(date("Ymd").time()); 
      $this->toFileName = $name; 
      $this->mencodeComm = true; 
      return true; 
         }else{ 
       return false; 
      } 
    } 
  } 
 
//设置文件,图片大小 
  function setSize($flvSize,$picSize) { 
    $flvWidth = $flvSize[0]; 
    $flvHeight = $flvSize[1]; 
    $picWidth = $picSize[0]; 
    $picHeight = $picSize[1]; 
    $picName = $this->toPicPath.$this->toFileName.".jpg"; 
    $flvName = $this->toFilePath.$this->toFileName.".flv"; 
    $toMdi = ROOT_DIR."/".$flvName; 
    $size = $picWidth."x".$picHeight; 
    if($this->mpegComm){ 
      $this->cmdToFile= "$this->mpeg -i $this->fromFile -y -ab 56 -ar 22050 -b 500 -r 15 -s $flvWith*$flvHeight $flvName"; 
    } 
    elseif($this->mencodeComm){ 
      $this->cmdToFile = "$this->mencode $this->fromFile  -vf scale=$flvWidth:$flvHeight -ffourcc FLV1 -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=70:acodec=mp3:abitrate=56:dia=-1 -ofps 25 -srate 22050 -oac mp3lame -o $flvName"; 
    } 
    $this->cmdToPic = "$this->mpeg -i $toMdi -y -f image2 -ss 8 -t 0.003 -s $size $picName"; 
    $this->cmdMidi = "$this->midi $toMdi /k"; 
    echo $this->cmdToPic; 
  } 
 
//开始转换 
  function toEcode() { 
    set_time_limit(0); 
    exec($this->cmdToFile,$flvStatus); 
    exec($this->cmdToPic,$picStatus); 
    exec($this->cmdMidi,$mStatus); 
  } 
 
 }
分享到:更多 ()

抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址