ffmpeg入门及java操作ffmpeg对视频进行处理
一.ffmpeg
1.簡介
FFmpeg是一個開源免費跨平臺的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據(jù)你選擇的組件)。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多codec都是從頭開發(fā)的。
FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運行,包括Windows、Mac OS X等。
多媒體視頻處理工具FFmpeg有非常強大的功能,包括視頻采集功能、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印等。
ffmpeg在windows下的視頻采集
在windows下關(guān)于ffmpeg視頻采集的資料非常少,但是ffmpeg還是支持windows下視頻采集的。ffmpeg支持windows下video for windows(VFW)設(shè)備的視頻采集,不過VFW設(shè)備已經(jīng)過時,正在被WDM的視頻設(shè)備所取代,但是ffmpeg還沒有支持WDM的計劃,不過好像有將WDM轉(zhuǎn)為VFW的工具,因此ffmpeg還是可以在windows下進行視頻采集的。
視頻格式轉(zhuǎn)換功能
ffmpeg視頻轉(zhuǎn)換功能。視頻格式轉(zhuǎn)換,比如可以將多種視頻格式轉(zhuǎn)換為flv格式,可不是視頻信號轉(zhuǎn)換 。
ffmpeg可以輕易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換(wma,rm,avi,mod等),例如可以將攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。
視頻截圖功能
對于選定的視頻,截取指定時間的縮略圖。視頻抓圖,獲取靜態(tài)圖和動態(tài)圖,不提倡抓gif文件;因為抓出的gif文件大而播放不流暢
給視頻加水印功能
使用ffmpeg 視頻添加水印(logo)。
2.mac下安裝ffmpeg
(2)先安裝Homebrew
終端下直接輸入以下命令即可:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"(2)安裝ffmpeg
終端下直接輸入以下命令即可:
brew install ffmpeg安裝后輸入ffmpeg命令
?
3.ffmpeg常用命令
將視頻 MP4 轉(zhuǎn)化為 GIF ffmpeg -i small.mp4 small.gif 轉(zhuǎn)化視頻中的一部分為 GIF ffmpeg -t 3 -ss 00:00:02 -i small.webm small-clip.gif 從視頻中第二秒開始,截取時長為3秒的片段轉(zhuǎn)化為 gif ? 轉(zhuǎn)化高質(zhì)量 GIF 默認轉(zhuǎn)化是中等質(zhì)量模式,若要轉(zhuǎn)化出高質(zhì)量的 gif,可以修改比特率 ? 視頻屬性調(diào)整 ffmpeg -i small.mp4 -b 2048k small.gif ? 縮放視頻尺寸 ffmpeg -i big.mov -vf scale=360:-1 small.mov 注意 sacle 值必須是偶數(shù),這里的 -1 表示保持長寬比,根據(jù)寬度值自適應(yīng)高度。 ? 如果要求壓縮出來的視頻尺寸長寬都保持為偶數(shù),可以使用 -2 ? 加倍速播放視頻 ffmpeg -i input.mov -filter:v "setpts=0.5*PTS" output.mov ? 定義幀率 16fps ffmpeg -i input.mov -r 16 -filter:v "setpts=0.125*PTS" -an output.mov ? 慢倍速播放視頻 ffmpeg -i input.mov -filter:v "setpts=2.0*PTS" output.mov ? 靜音視頻(移除視頻中的音頻) ffmpeg -i input.mov -an mute-output.mov -an 就是禁止音頻輸出 ? 將 GIF 轉(zhuǎn)化為 MP4 ffmpeg -f gif -i animation.gif animation.mp4 ? 也可以將 gif 轉(zhuǎn)為其他視頻格式 ffmpeg -f gif -i animation.gif animation.mpeg ffmpeg -f gif -i animation.gif animation.webm ? 將視頻中的音頻換成另一個音頻 ffmpeg -i odd.mp4 -i bgm.mp3 -t 7 -y new.mp4 將odd.mp4中的音頻換成bgm.mp3,視頻長度為7秒,保存為一個新文件new.mp4 ? 獲取 GIF 的第一幀圖片 使用 ImageMagick 可以方便第提取 gif 圖片的第 N 幀圖像。 安裝 ImageMagick brew install imagemagick 提取第一幀 convert 'animation.gif[0]' animation-first-frame.gif 通過 [0] 就可以提取出 gif 的第一幀圖像。二.java操作ffmpeg處理視頻
由于使用ffmpeg需要在cmd或者終端中執(zhí)行shell命令,java的JDK里面提供了一個類ProcessBuilder,來幫助我們?nèi)?zhí)行指定的shell腳本,達到對應(yīng)的目的。
1.ProcessBuilder介紹
通過Java執(zhí)行系統(tǒng)命令,與cmd中或者終端上一樣執(zhí)行shell命令,最典型的用法就是使用Runtime.getRuntime().exec(command)或者new ProcessBuilder(cmdArray).start()。從JDK1.5開始,官方提供并推薦使用ProcessBuilder類進行shell命令操作。
使用ProcessBuilder很簡單,只需要通過Arrays.asList()構(gòu)建一個List的參數(shù)集合,然后在ProcessBuilder的構(gòu)造函數(shù)傳入?yún)?shù),即可 start()方法執(zhí)行
2.java操作ffmpeg代碼示例
public class MergeVideoMp3 { ?private String ffmpegEXE; ?public MergeVideoMp3(String ffmpegEXE) {super();this.ffmpegEXE = ffmpegEXE;} ?/*** 將視頻中的音頻替換為指定音頻** @param videoInputPath* @param mp3InputPath* @param seconds* @param videoOutputPath* @throws Exception*/public void convertor(String videoInputPath, String mp3InputPath,double seconds, String videoOutputPath) throws Exception { // ffmpeg.exe -i odd.mp4 -i bgm.mp3 -t 7 -y new.mp4List<String> command = new ArrayList<>();command.add(ffmpegEXE); ?command.add("-i");command.add(videoInputPath); ?command.add("-i");command.add(mp3InputPath); ?command.add("-t");command.add(String.valueOf(seconds)); ?command.add("-y");command.add(videoOutputPath); ?InputStream errorStream = null;InputStreamReader inputStreamReader = null;BufferedReader br = null;try {ProcessBuilder builder = new ProcessBuilder(command);Process process = builder.start(); ?errorStream = process.getErrorStream();inputStreamReader = new InputStreamReader(errorStream);br = new BufferedReader(inputStreamReader); ?while (br.readLine() != null) {}} finally {if (br != null) {br.close();}if (inputStreamReader != null) {inputStreamReader.close();}if (errorStream != null) {errorStream.close();}}} ?public static void main(String[] args) {//參數(shù)為ffmpeg啟動命令的路徑。在bin目錄中MergeVideoMp3 ffmpeg = new MergeVideoMp3("/usr/local/Cellar/ffmpeg/4.1.4/bin/ffmpeg");try {ffmpeg.convertor("/Users/apple/workspace//video-file/180425CFA4RB6T0H/video/test.mp4", "/Users/apple/workspace//video-file/bgm/11796.mp3", 7.1, "/Users/apple/workspace//video-file/180425CFA4RB6T0H/video/test222.mp4");} catch (Exception e) {e.printStackTrace();}} ? }?
總結(jié)
以上是生活随笔為你收集整理的ffmpeg入门及java操作ffmpeg对视频进行处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java使用POI工具类导出excel
- 下一篇: mac搭建nginx+rtmp直播流