最近在進(jìn)行php項(xiàng)目開發(fā)中,使用了ffmpeg對(duì)視頻進(jìn)行處理,但是發(fā)現(xiàn)處理過(guò)程中出現(xiàn)了一些莫名奇妙的失敗情況,導(dǎo)致項(xiàng)目進(jìn)度拖延。
一般情況下,ffmpeg處理視頻有很多種不同的方式,比如轉(zhuǎn)格式、縮放、剪切、加水印等等。欲了解更多的ffmpeg處理方式,可以參考ffmpeg官方文檔。
舉個(gè)例子,比如在進(jìn)行視頻轉(zhuǎn)碼過(guò)程中,使用以下代碼:
&1'; $result = exec($command); ?>
在此代碼中,我們將一個(gè)視頻文件 input.mp4 轉(zhuǎn)換成了 libx264 編碼的 mp4 文件。但是,假設(shè)input.mp4文件不符合ffmpeg所支持的格式,或是input.mp4文件本身已經(jīng)損壞,那么上述代碼就會(huì)返回類似以下的錯(cuò)誤:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 Duration: 00:00:05.01, start: 0.000000, bitrate: 11639 kb/s Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 11505 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 159 kb/s (default) Metadata: handler_name : SoundHandler [NULL @ 0x7f8f38058000] Unable to find a suitable output format for '2000k' 2000k: Invalid argument
從錯(cuò)誤信息中可以看出,ffmpeg并沒(méi)有找到一個(gè)合適的輸出格式來(lái)處理2000k這個(gè)參數(shù),從而導(dǎo)致了錯(cuò)誤。這種錯(cuò)誤是非常隱蔽的,因?yàn)樵诖a編寫時(shí)并沒(méi)有提示用戶文件格式不支持或文件已損壞。
除了文件格式不支持或文件損壞導(dǎo)致的失敗,還有很多其他原因可能會(huì)導(dǎo)致ffmpeg處理失敗,例如ffmpeg所需的庫(kù)文件版本不匹配,系統(tǒng)環(huán)境缺少必要的依賴,轉(zhuǎn)換參數(shù)設(shè)置不當(dāng),以及cpu/內(nèi)存資源不足等等。所有這些問(wèn)題,都可能導(dǎo)致ffmpeg的生成的錯(cuò)誤信號(hào)不同,很難在最短的時(shí)間內(nèi)進(jìn)行排查。
綜上所述,當(dāng)使用ffmpeg進(jìn)行視頻處理時(shí),多花些時(shí)間做好錯(cuò)誤處理可能會(huì)帶來(lái)意想不到的好處。例如,在轉(zhuǎn)換視頻文件時(shí),可以添加try-catch語(yǔ)句,找到并處理所有異常情況。這樣就可以確保ffmpeg處理步驟沒(méi)有問(wèn)題,并且及時(shí)處理ffmpeg錯(cuò)誤,提升開發(fā)效率,避免開發(fā)過(guò)程中出現(xiàn)不必要的延誤。