使用Java和ffmpeg把音頻和視頻合成視頻的操作方法
FFmpeg是一個開源免費(fèi)跨平臺的視頻和音頻流方案,屬于自由軟件,采用LGPL或GPL許可證(依據(jù)你選擇的組件)。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多codec都是從頭開發(fā)的。
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序。它包括了目前領(lǐng)先的音/視頻編碼庫libavcodec。 FFmpeg是在Linux下開發(fā)出來的,但它可以在包括Windows在內(nèi)的大多數(shù)操作系統(tǒng)中編譯。這個項(xiàng)目是由Fabrice Bellard發(fā)起的,現(xiàn)在由Michael Niedermayer主持??梢暂p易地實(shí)現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換,例如可以將攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式
主要功能:
1、視頻格式轉(zhuǎn)換功能
ffmpeg視頻轉(zhuǎn)換功能。視頻格式轉(zhuǎn)換,比如可以將多種視頻格式轉(zhuǎn)換為flv格式,可不是視頻信號轉(zhuǎn)換 。
ffmpeg可以輕易地實(shí)現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換(wma,rm,avi,mod等),例如可以將攝錄下的視頻avi等轉(zhuǎn)成現(xiàn)在視頻網(wǎng)站所采用的flv格式。
2、視頻截圖功能
對于選定的視頻,截取指定時(shí)間的縮略圖。視頻抓圖,獲取靜態(tài)圖和動態(tài)圖,不提倡抓gif文件;因?yàn)樽コ龅膅if文件大而播放不流暢
3、給視頻加水印功能
使用ffmpeg 視頻添加水印(logo)。
好了,下面開始今天的正文。
借助第三方工具ffmpeg合成視頻
需求:在小破站上下載了一些視頻,但是放到電腦里面看,我擦,聲音文件和視頻文件是分開的。
- 正確安裝ffmpeg并配置好環(huán)境變量。
- Java代碼測試
里面是下載的視頻和音頻
我就上代碼遞歸了,只要用正確的ffmpeg的命令和Java調(diào)用ffmpeg.exe的程序,就可以合成啦。
package com.lovely.test; import java.io.BufferedReader; import java.io.File; //import java.io.FileInputStream; //import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; /** * * 視頻中獲取音頻文件 * */ public class TestFfmpeg { // FFmpeg全路徑 private static final String FFMPEG_PATH = "D:\\softWare\\tools\\joyTool\\ffmpeg\\bin\\ffmpeg.exe"; public static void main(String[] args) { String path = "E:\\StudyVedio\\ComputerScience\\US"; try { getAll(path); } catch (Exception e) { e.printStackTrace(); } } /** * 具體合成視頻函數(shù) * @param videoInputPath * 原視頻的全路徑 * * @param audioInputPath * 音頻的全路徑 * * @param videoOutPath * 視頻與音頻結(jié)合之后的視頻的路徑 */ public static void convetor(String videoInputPath, String audioInputPath, String videoOutPath) throws Exception { Process process = null; InputStream errorStream = null; InputStreamReader inputStreamReader = null; BufferedReader br = null; try { // ffmpeg命令 String command = FFMPEG_PATH + " -i " + videoInputPath + " -i " + audioInputPath + " -c:v copy -c:a aac -strict experimental " + " -map 0:v:0 -map 1:a:0 " + " -y " + videoOutPath; process = Runtime.getRuntime().exec(command); errorStream = process.getErrorStream(); inputStreamReader = new InputStreamReader(errorStream); br = new BufferedReader(inputStreamReader); // 用來收集錯誤信息的 String str = ""; while ((str = br.readLine()) != null) { System.out.println(str); } process.waitFor(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { br.close(); } if (inputStreamReader != null) { inputStreamReader.close(); } if (errorStream != null) { errorStream.close(); } } } // 遞歸函數(shù) public static void getAll(String path) throws Exception { String videoInputPath = ""; String audioInputPath = ""; String videoOutPath = ""; File file = new File(path); if (file.isDirectory()) { File[] files = file.listFiles(); for (File f : files) { getAll(f.getPath()); if (f.isFile()) { if (f.getName().endsWith(".m4s")) { if (f.getName().endsWith("audio.m4s")) audioInputPath = file.getPath() + "\\audio.m4s"; if (f.getName().endsWith("video.m4s")) videoInputPath = file.getPath() + "\\video.m4s"; videoOutPath = file.getPath() + "\\all.mp4"; if (!videoInputPath.equals("")) convetor(videoInputPath, audioInputPath, videoOutPath); } } } } } }
我最后用了好幾分鐘合成了30個完整的視頻。體會了遞歸的強(qiáng)大。
總結(jié)
到此這篇關(guān)于使用Java和ffmpeg把音頻和視頻合成視頻的操作方法的文章就介紹到這了,更多相關(guān)java ffmpeg音頻合成視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java String類簡單用法實(shí)戰(zhàn)示例【字符串輸出、比較】
這篇文章主要介紹了Java String類簡單用法,結(jié)合具體實(shí)例形式分析了Java使用String類實(shí)現(xiàn)字符串的輸出和比較功能相關(guān)操作技巧,需要的朋友可以參考下2019-07-07Java Eclipse中實(shí)現(xiàn)快速替換變量
這篇文章主要介紹了Java Eclipse中實(shí)現(xiàn)快速替換變量,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java Collections的emptyList、EMPTY_LIST詳解與使用說明
這篇文章主要介紹了Java Collections的emptyList、EMPTY_LIST詳解與使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11一文探究ArrayBlockQueue函數(shù)及應(yīng)用場景
這篇文章主要為大家介紹了一文探究ArrayBlockQueue函數(shù)及應(yīng)用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03關(guān)于Java創(chuàng)建線程的2種方式以及對比
這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建線程的2種方式以及對比的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01