最近有個項目需要在上傳高音質(zhì)音樂文件同時生成低音質(zhì)的音樂文件,低音質(zhì)用來給用戶試聽。找了半天都是些應(yīng)用軟件比如adobe audition?,F(xiàn)在需要在網(wǎng)站上應(yīng)用,搞半天硬是沒找到一款軟件的API。 偶然在sourceforge.net看見ffmpeg-php主要用于處理視頻的,比如常用的視頻截圖,獲取視頻參數(shù),轉(zhuǎn)換視頻格式。就下載下來根據(jù)教程安裝擴展后,可以mp3文件的轉(zhuǎn)換,OK!成功從320kbps ->128kbps(當(dāng)然128可以根據(jù)需要設(shè)置)。
說明:如果你按下列的步驟不能成功配置或者環(huán)境不是apache,可以采取ffmpeg.exe來執(zhí)行,當(dāng)然這個需要一定的權(quán)限。
下面列一下安裝過程和使用方法:
首先介紹下我使用的集成環(huán)境wamp。
OS: Win XP sp2
PHP: 5.2.8
Apache: 2.2.11
補充,本人在Window 2003 sp2上初次安裝失敗原因是VC庫沒有安裝的原因?qū)е聀hpinfo查看無ffmpeg項。
看了下系統(tǒng)錯誤日志:
Generate Activation Context 為 [path...]\php_ffmpeg.dll 失敗。 參考錯誤消息: 參照的匯編沒有安裝在系統(tǒng)上。
Resolve Partial Assembly 為 Microsoft.VC80.CRT 失敗。 參考錯誤消息: 參照的匯編沒有安裝在系統(tǒng)上。
=====================================================================
請下載,Microsoft Visual C++ 2005 Redistributable Package (x86) 在重啟apache,查看phpinfo是否有ffmpeg項。
下載地址:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=32BC1BEE-A3F9-4C13-9C99-220B62A191EE
ffmpeg官方使用說明:http://www.ffmpeg.org/ffmpeg-doc.html
1.下載ffmpeg-php:http://sergey89.ru/files/ffmpeg-php-win32-all.zip 本站下載地址
2. 解壓ffmpeg-php-win32-all.zip 后有下面幾個文件:
avcodec-51.dll
avformat-51.dll
avutil-49.dll
php_ffmpeg.dll
pthreadGC2.dll
3. 將(avcodec-51.dll, avformat-51.dll, avutil-49.dll, pthreadGC2.dll)四個文件拷貝到windows\system32文件夾下面。將php_ffmpeg.dll拷貝到php文件夾的ext文件夾下(wamp:盤符:\wamp路徑\bin\php\php5.2.8\ext)。
4. 然后需要到apache\bin文件下找到php.ini文件下允許使用dll文件加入extension=php_ffmpeg.dll 并允許 extension=php_gd2.dll, extension=php_gettext.dll這兩個,改動后如下(去掉前面的分號就代表允許執(zhí)行):
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_ffmpeg.dll
5. 重新啟動wamp后使用phpinfo()函數(shù)看到如下圖信息配置就表明ffmpeg在php環(huán)境中配置成功了。
6. 下面我們建立一個php的頁面來測試是不是可以使用ffmpeg的一些函數(shù)功能。
12345678 | <?php/* * Beyond-1.mp3 在當(dāng)前php目錄下,如果其他目錄地址請?zhí)顚懲暾?* -i <被轉(zhuǎn)換的文件路徑> * -ab <比特率> 設(shè)定聲音比特率 */exec('ffmpeg -i Beyond-1.mp3 -ab 128 Beyond-2.mp3');?> |
運行后 在當(dāng)前文件夾下生成了Beyond-2.mp3文件。查看文件屬性位速成功由320kbps ->128kbps,當(dāng)然文件也小了不少(10M-4M)。
7.雖然以上我的目的達到了,但我補充下ffmpeg對視頻的處理功能,說不定以后要用。下面我們建立一個php的頁面來測試是不是可以使用ffmpeg的一些函數(shù)功能。建立testvideo.php文件
代碼如下:
12345678910111213141516171819202122232425262728 | <?phpextension_loaded('ffmpeg');// F:\mv\1.wmv 視頻文件的路徑。$ffmpegInstance = new ffmpeg_movie('F:\mv\1.wmv');echo "getDuration: " . $ffmpegInstance->getDuration()."<br>" ."getFrameCount: " . $ffmpegInstance->getFrameCount()."<br>" ."getFrameRate: " . $ffmpegInstance->getFrameRate()."<br>" ."getFilename: " . $ffmpegInstance->getFilename()."<br>" ."getComment: " . $ffmpegInstance->getComment()."<br>" ."getTitle: " . $ffmpegInstance->getTitle()."<br>" ."getAuthor: " . $ffmpegInstance->getAuthor()."<br>" ."getCopyright: " . $ffmpegInstance->getCopyright()."<br>" ."getArtist: " . $ffmpegInstance->getArtist()."<br>" ."getGenre: " . $ffmpegInstance->getGenre()."<br>" ."getTrackNumber: " . $ffmpegInstance->getTrackNumber()."<br>" ."getYear: " . $ffmpegInstance->getYear()."<br>" ."getFrameHeight: " . $ffmpegInstance->getFrameHeight()."<br>" ."getFrameWidth: " . $ffmpegInstance->getFrameWidth()."<br>" ."getPixelFormat: " . $ffmpegInstance->getPixelFormat()."<br>" ."getBitRate: " . $ffmpegInstance->getBitRate()."<br>" ."getVideoBitRate: " . $ffmpegInstance->getVideoBitRate()."<br>" ."getAudioBitRate: " . $ffmpegInstance->getAudioBitRate()."<br>" ."getAudioSampleRate: " . $ffmpegInstance->getAudioSampleRate()."<br>" ."getVideoCodec: " . $ffmpegInstance->getVideoCodec()."<br>" ."getAudioCodec: " . $ffmpegInstance->getAudioCodec()."<br>" ."getAudioChannels: " . $ffmpegInstance->getAudioChannels()."<br>" ."hasAudio: " . $ffmpegInstance->hasAudio();?> |
8.執(zhí)行后如果拿到視頻的一些信息如下就表示環(huán)境配置成功了,那我們就可以開始開發(fā)我們的視頻轉(zhuǎn)換了。
執(zhí)行結(jié)果:
getDuration: 250
getFrameCount: 6250
getFrameRate: 25
getFilename: F:\mv\1.wmv
getComment:
getTitle:
getAuthor:
getCopyright:
getArtist:
getGenre:
getTrackNumber: 0
getYear: 0
getFrameHeight: 300
getFrameWidth: 400
getPixelFormat: yuv420p
getBitRate: 311111
getVideoBitRate: 256000
getAudioBitRate: 64032
getAudioSampleRate: 48000
getVideoCodec: wmv2
getAudioCodec: wmav2
getAudioChannels: 2
hasAudio: 1
9.接下來介紹下ffmpeg視頻音樂文件處理的語法參數(shù):
ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320×240 f:\test.flv
使用-ss參數(shù) 作用(time_off set the start time offset),可以從指定時間點開始轉(zhuǎn)換任務(wù)。如:
轉(zhuǎn)換文件格式的同時抓縮微圖:
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轉(zhuǎn)換命令
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參數(shù)設(shè)定解說
-bitexact 使用標(biāo)準(zhǔn)比特率
-vcodec xvid 使用xvid壓縮
-s 320×240 指定分辨率
-r 29.97 楨速率(可以改,確認非標(biāo)準(zhǔn)楨率會導(dǎo)致音畫不同步,所以只能設(shè)定為15或者29.97)
畫面部分,選其一
-b <比特率> 指定壓縮比特率,似乎ffmpeg是自動VBR的,指定了就大概是平均比特率,比如768,1500這樣的就是原來默認項目中有的
-qscale <數(shù)值> 以<數(shù)值>質(zhì)量為基礎(chǔ)的VBR,取值0.01-255,約小質(zhì)量越好
-qmin <數(shù)值> 設(shè)定最小質(zhì)量,與-qmax(設(shè)定最大質(zhì)量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同樣的質(zhì)量
聲音部分
-acodec aac 設(shè)定聲音編碼
-ac <數(shù)值> 設(shè)定聲道數(shù),1就是單聲道,2就是立體聲,轉(zhuǎn)換單聲道的TVrip可以用1(節(jié)省一半容量),高品質(zhì)的DVDrip就可以用2
-ar <采樣率> 設(shè)定聲音采樣率,PSP只認24000
-ab <比特率> 設(shè)定聲音比特率,前面-ac設(shè)為立體聲時要以一半比特率來設(shè)置,比如192kbps的就設(shè)成96,轉(zhuǎn)換默認比特率都較小,要聽到較高品質(zhì)聲音的話建議設(shè)到160kbps(80)以上
-vol <百分比> 設(shè)定音量,某些DVDrip的AC3軌音量極小,轉(zhuǎn)換時可以用這個提高音量,比如200就是原來的2倍。這樣,要得到一個高畫質(zhì)音質(zhì)低容量的MP4的話,首先畫面最好不要用固定比特率,而用VBR參數(shù)讓程序自己去判斷,而音質(zhì)參數(shù)可以在原來的基礎(chǔ)上提升一點,聽起來要舒服很多,也不會太大(看情況調(diào)整)
例子: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.***”
解釋:以上命令可以在Dos命令行中輸入,也可以創(chuàng)建到批處理文件中運行。不過,前提是:要在ffmpeg所在的目錄中執(zhí)行(轉(zhuǎn)換君所在目錄下面的cores子目錄)。
參數(shù):
-y(覆蓋輸出文件,即如果1.***文件已經(jīng)存在的話,不經(jīng)提示就覆蓋掉了)
-i “1.avi”(輸入文件是和ffmpeg在同一目錄下的1.avi文件,可以自己加路徑,改名字)
-title “Test”(在PSP中顯示的影片的標(biāo)題)
-vcodec xvid(使用XVID編碼壓縮視頻,不能改的)
-s 368×208(輸出的分辨率為368×208,注意片源一定要是16:9的不然會變形)
-r 29.97(幀數(shù),一般就用這個吧)
-b 1500(視頻數(shù)據(jù)流量,用-b xxxx的指令則使用固定碼率,數(shù)字隨便改,1500以上沒效果;還可以用動態(tài)碼率如:-qscale 4和-qscale 6,4的質(zhì)量比6高)
-acodec aac(音頻編碼用AAC)
-ac 2(聲道數(shù)1或2)
-ar 24000(聲音的采樣頻率,好像PSP只能支持24000Hz)
-ab 128(音頻數(shù)據(jù)流量,一般選擇32、64、96、128)
-vol 200(200%的音量,自己改)
-f psp(輸出psp專用格式)
-muxvb 768(好像是給PSP機器識別的碼率,一般選擇384、512和768,我改成1500,PSP就說文件損壞了)
“1.***”(輸出文件名,也可以加路徑改文件名)
機器強勁的話,可以多開幾個批處理文件,讓它們并行處理。
=================================================================================
Ffmpeg使用語法
ffmpeg [[options][`-i' input_file]]… {[options] output_file}…
如果沒有輸入文件,那么視音頻捕捉就會起作用。
作為通用的規(guī)則,選項一般用于下一個特定的文件。如果你給 –b 64選項,改選會設(shè)置下一個視頻速率。對于原始輸入文件,格式選項可能是需要的。
缺省情況下,ffmpeg試圖盡可能的無損轉(zhuǎn)換,采用與輸入同樣的音頻視頻參數(shù)來輸出。
選項
a) 通用選項
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協(xié)議的。。。
-f fmt 強迫采用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設(shè)置紀(jì)錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設(shè)置標(biāo)題
-author string 設(shè)置作者
-copyright string 設(shè)置版權(quán)
-comment string 設(shè)置評論
-target type 設(shè)置目標(biāo)文件類型(vcd,svcd,dvd) 所有的格式選項(比特率,編解碼以及緩沖區(qū)大?。┳詣釉O(shè)置 ,只需要輸入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質(zhì)量設(shè)置
-itsoffset offset 設(shè)置以秒為基準(zhǔn)的時間偏移,該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味著相應(yīng)的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
b) 視頻選項
-b bitrate 設(shè)置比特率,缺省200kb/s
-r fps 設(shè)置幀頻 缺省25
-s size 設(shè)置幀大小 格式為WXH 缺省160X128.下面的簡寫也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設(shè)置頂部切除帶大小 像素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設(shè)置頂部補齊的大小 像素單位
-padbottom size –padleft size –padright size –padcolor color 設(shè)置補齊條顏色(hex,6個16進制的數(shù),紅:綠:蘭排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設(shè)置視頻碼率容忍度kbit/s
-maxrate bitrate設(shè)置最大視頻碼率容忍度
-minrate bitreate 設(shè)置最小視頻碼率容忍度
-bufsize size 設(shè)置碼率控制緩沖區(qū)大小
-vcodec codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝。
-sameq 使用同樣視頻質(zhì)量作為源(VBR)
-pass n 選擇處理遍數(shù)(1或者2)。兩遍編碼非常有用。第一遍生成統(tǒng)計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀(jì)錄文件名為file
c)高級視頻選項
-g gop_size 設(shè)置圖像組大小
-intra 僅適用幀內(nèi)編碼
-qscale q 使用固定的視頻量化標(biāo)度(VBR)
-qmin q 最小視頻量化標(biāo)度(VBR)
-qmax q 最大視頻量化標(biāo)度(VBR)
-qdiff q 量化標(biāo)度間最大偏差 (VBR)
-qblur blur 視頻量化標(biāo)度柔化(VBR)
-qcomp compression 視頻量化標(biāo)度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始復(fù)雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp偏差
-i_qoffset offset 在p和i幀間的qp偏差
-rc_eq equation 設(shè)置碼率控制方程 默認tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設(shè)置運動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 設(shè)置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設(shè)置idct算法??捎玫挠?0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設(shè)置錯誤殘留為n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設(shè)置錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用于mpeg4
-part 使用數(shù)據(jù)劃分 僅用于mpeg4
-bug param 繞過沒有被自動監(jiān)測到編碼器的問題
-strict strictness 跟標(biāo)準(zhǔn)的嚴格性
-aic 使能高級幀內(nèi)編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不采用交織方法
-interlace 強迫交織法編碼 僅對mpeg2和mpeg4有效。當(dāng)你的輸入是交織的并且你想要保持交織以最小圖像損失的時候采用該選項。可選的方法是不交織,但是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視頻編碼統(tǒng)計到vstats_hhmmss.log
-vhook module 插入視頻處理模塊 module 包括了模塊名和參數(shù),用空格分開
D)音頻選項
-ab bitrate 設(shè)置音頻碼率
-ar freq 設(shè)置音頻采樣率
-ac channels 設(shè)置通道 缺省為1
-an 不使能音頻紀(jì)錄
-acodec codec 使用codec編解碼
E)音頻/視頻捕獲選項
-vd device 設(shè)置視頻捕獲設(shè)備。比如/dev/video0
-vc channel 設(shè)置視頻捕獲通道 DV1394專用
-tvstd standard 設(shè)置電視標(biāo)準(zhǔn) NTSC PAL(SECAM)
-dv1394 設(shè)置DV1394捕獲
-av device 設(shè)置音頻設(shè)備 比如/dev/dsp
F)高級選項
-map file:stream 設(shè)置輸入流映射
-debug 打印特定調(diào)試信息
-benchmark 為基準(zhǔn)測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確算法 用于編解碼測試
-ps size 設(shè)置包大小,以bits為單位
-re 以本地幀頻讀數(shù)據(jù),主要用于模擬捕獲設(shè)備
-loop 循環(huán)輸入流。只工作于圖像流,用于ffserver測試