轉換音訊和視訊ffmpeg
使用之前先把
ffmpeg包放入工程的下。確保編譯後在classes層,這裡有我寫的MP3到ogg,ogg到MP3,語音資訊獲取等
package xx.util; import xx.ParameterChecker; import xx.StringUtilsEx; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.regex.Matcher;import java.util.regex.Pattern; public class FFMpegUtils { /** * ffmpeg 目錄路徑 */ private final static String FFMPEG_PATH = "files/ffmpeg/"; private static String ffmpegUri ; private static String mencoderUri; /** * 初始化 ffmpeg路徑 */ private static void init(){ if(ffmpegUri==null){ Properties prop = System.getProperties(); String os = prop.getProperty("os.name"); String realPath=StringUtilsEx.getContextPath(); if(os.startsWith("win") || os.startsWith("Win")){ ffmpegUri = realPath + FFMPEG_PATH + "windows/ffmpeg.exe"; mencoderUri = realPath + FFMPEG_PATH + "windows/mencoder.exe"; } else{ ffmpegUri= realPath + FFMPEG_PATH + "linux/ffmpeg"; mencoderUri = realPath + FFMPEG_PATH + "linux/mencoder"; } } } private static String getFfmpegUri(){ init(); return ffmpegUri; } private static String getMencoderUri(){ init(); return mencoderUri; } /** * 獲取音訊資訊 * @param filePath 原始檔路徑 */ public static Audio parseAudio(String filePath)throws Exception{ List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); Audio audio = new Audio(); try{ String result = exec(cmd); if(ParameterChecker.isNullOrEmpty(result)){ System.out.println("視訊檔案解析失敗"); } Matcher matcherInput = Pattern.compile("Input #0, (.*?), from (.*?)").matcher(result); Matcher baseMatcher = Pattern.compile("Duration: (.*?),(.*?)bitrate: (\\d*) kb\\/s").matcher(result); Matcher audioMatcher = Pattern.compile("Audio: (\\w*)(.*?), (\\d*) Hz").matcher(result); if(matcherInput.find()){ audio.setType(matcherInput.group(1)); } if(baseMatcher.find()){ audio.setDuration( runtimeToSecond(baseMatcher.group(1))); audio.setBitRate(Long.parseLong(baseMatcher.group(3))); } if(audioMatcher.find()){ audio.setFormat(audioMatcher.group(1)); audio.setFrequency(audioMatcher.group(3)); } } catch(Exception ex){ System.out.println("視訊檔案解析失敗"); } return audio; } /** * 獲取視訊資訊 * @param filePath 原始檔路徑 */ public static Video parseVideo(String filePath)throws Exception{ List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); Video video = new Video(); try{ video.setSrcFile(filePath); String result = exec(cmd); if(ParameterChecker.isNullOrEmpty(result)){ System.out.println("視訊檔案解析失敗"); } Matcher matcherInput = Pattern.compile("Input #0, (.*?), from (.*?)").matcher(result); Matcher baseMatcher = Pattern.compile("Duration: (.*?), start: (.*?), bitrate: (\\d*) kb\\/s").matcher(result); Matcher videoMatcher = Pattern.compile("Video: (\\w*)(.*?), (.*?), (.*?)[\\s\\S]*").matcher(result); Matcher audioMatcher = Pattern.compile("Audio: (\\w*)(.*?), (\\d*) Hz").matcher(result); Matcher rotateMatcher = Pattern.compile("rotate(\\s*):(\\s*)(\\d+)").matcher(result); if(matcherInput.find()){ video.setType(matcherInput.group(1)); } if(baseMatcher.find()){ video.setDuration( runtimeToSecond(baseMatcher.group(1))); video.setBitRate(Integer.parseInt(baseMatcher.group(3))); } if(rotateMatcher.find()){ int rotate = Integer.parseInt(rotateMatcher.group(3)); video.setRotate((rotate+360) % 360); } if(videoMatcher.find()){ String videoInfo = videoMatcher.group(0); Matcher m = Pattern.compile("([1-9]\\d*x[1-9]\\d*)").matcher(videoInfo); if(m.find()){ video.setResolution(m.group(0)); video.setDestResolution(); } m = Pattern.compile("Unknown format").matcher(videoInfo); if(m.find()){ video.setSupport(false); } else{ video.setSupport(true); } video.setVideoFormat(videoMatcher.group(1)); } if(audioMatcher.find()){ video.setAudioFormat(audioMatcher.group(1)); } } catch(Exception ex){ System.out.println("視訊檔案解析失敗"); } return video; } public static Process processAvi(String originFileUri , String fileSavePath) throws Exception { List<String> commend = new ArrayList<String>(); commend.add(getMencoderUri()); commend.add(originFileUri); commend.add("-ovc"); commend.add("lavc"); commend.add("-oac"); commend.add("mp3lame"); commend.add("-lavcopts"); commend.add("acodec=mp3:abitrate=64"); commend.add("-xvidencopts"); commend.add("bitrate=600"); commend.add("-vf"); commend.add("scale=320:-3"); commend.add("-of"); commend.add("avi"); commend.add("-o"); commend.add(fileSavePath); ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(commend); Process p = processBuilder.start(); return p; } public static void audioTransOgg(String originFileUri, String fileSavePath) throws Exception { try { List<String> commend = new ArrayList<String>(); commend.add(getFfmpegUri()); commend.add("-i"); commend.add(originFileUri); commend.add("-acodec"); commend.add("libvorbis"); commend.add(fileSavePath); exec(commend); } catch(Exception ex){ System.out.println("視訊檔案解析失敗"); } } /** * 生成視訊截圖 * @param filePath 原始檔路徑 * @param imageSavePath 截圖檔案儲存全路徑 * @param screenSize 截圖大小 如640x480 * @param transpose 旋轉 */ public static void makeScreenCut( String filePath, String imageSavePath , String screenSize ,String transpose )throws Exception{ try{ List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); cmd.add("-y"); cmd.add("-f"); cmd.add("image2"); cmd.add("-ss"); cmd.add("1"); cmd.add("-t"); cmd.add("0.001"); if(!ParameterChecker.isNullOrEmpty(transpose)){ cmd.add("-vf"); cmd.add(transpose); } cmd.add("-s"); cmd.add(screenSize); cmd.add(imageSavePath); exec(cmd); } catch(Exception ex){ System.out.println("視訊檔案解析失敗"); } } /** * 音訊轉換 * @param filePath 原始檔路徑 * @param fileSavePath 檔案儲存全路徑 * @param audioByte 音訊位元率 * @param audioCollection 音訊取樣率 * @param fps 每秒幀數(15或29.97) */ public static void audioTransfer(String filePath, String fileSavePath, int audioByte, int audioCollection)throws Exception{ try{ List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); cmd.add("-y"); cmd.add("-ab"); cmd.add( Integer.toString(audioByte) ); cmd.add("-ar"); cmd.add( Integer.toString(audioCollection) ); cmd.add("-ac"); cmd.add("1"); cmd.add( fileSavePath ); exec(cmd); } catch(Exception ex){ System.out.println("視訊檔案解析失敗"); } } /** * 視訊轉換(轉為libxvid) * @param filePath 原始檔路徑 */ public static String toLibxvid(String filePath) throws Exception{ try{ String ext = getFileExtention(filePath); String fileSavePath = filePath.replace("." + ext, ".tmp."+ext ); List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); cmd.add("-y"); cmd.add("-c:v"); cmd.add("libxvid"); cmd.add( fileSavePath ); exec(cmd); return fileSavePath; } catch(Exception ex){ System.out.println("視訊轉換失敗"); return null; } } /** * 視訊轉換 * @param filePath 原始檔路徑 * @param fileSavePath 檔案儲存全路徑 * @param screenSize 視訊解析度 如640x480 * @param audioByte 音訊位元率 * @param audioCollection 音訊取樣率 * @param quality 視訊質量(1-51)越低質量越好( 預設23) * @param preset (壓制速度placebo<veryslow<slower<slow<medium<fast<faster<veryfast<superfast<ultrafast) 預設medium,壓縮率與速度成反比 * @param fps 每秒幀數(15或29.97) * @param transpose 旋轉 * * */ public static void videoTransfer(String filePath, String fileSavePath, String screenSize, int audioByte, int audioCollection, double quality, String preset, double fps, String transpose)throws Exception{ try{ List<String> cmd = new ArrayList<String>(); cmd.add(getFfmpegUri()); cmd.add("-i"); cmd.add(filePath); cmd.add("-y"); cmd.add("-ab"); cmd.add( Integer.toString(audioByte) ); cmd.add("-ar"); cmd.add( Integer.toString(audioCollection) ); cmd.add("-r"); cmd.add( Double.toString(fps) ); cmd.add("-crf"); cmd.add( Double.toString(quality) ); cmd.add("-preset"); cmd.add(preset); cmd.add("-profile:v"); cmd.add("baseline"); if(!ParameterChecker.isNullOrEmpty(transpose)){ cmd.add("-vf"); cmd.add(transpose); cmd.add("-metadata:s:v:0"); cmd.add("rotate=0"); } cmd.add("-s"); cmd.add(screenSize); cmd.add( fileSavePath ); exec(cmd); } catch(Exception ex){ System.out.println("視訊轉換失敗"); } } /** * * @param filePath * @param fileSavePath * @param screenSize * @param transpose */ public static void videoTransfer(String filePath, String fileSavePath, String screenSize, String transpose) throws Exception{ videoTransfer(filePath, fileSavePath, screenSize, 43000, 44100, 23, "medium", 15, transpose); } /** * 把 hh:mm:ss 轉為秒 * @param str * @return */ private static int runtimeToSecond(String str){ int second = 0; String[] s = str.split(":"); if(s.length == 3){ second = Integer.parseInt(s[0])*60*60 + Integer.parseInt(s[1])*60 + (int)Math.abs(Double.parseDouble(s[2])); if (second == 0) { second = 1; } } return second; } /** * 執行指令 * @param cmd 執行指令 * @throws Exception */ private static String exec( List<String> cmd) throws Exception{ String outPut = ""; ProcessBuilder builder = new ProcessBuilder(); builder.command(cmd); builder.redirectErrorStream(true); Process proc = builder.start(); BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream())); String line; while ((line = stdout.readLine()) != null) { outPut += "\n" + line; if(line.indexOf("Error") == 0){ System.out.println(line); } } proc.waitFor(); stdout.close(); String lastLine = outPut.substring(outPut.lastIndexOf("\n")+1); if(lastLine.indexOf("Error") == 0){ throw new Exception(lastLine); } return outPut; } /** * 校驗檔案是否是語音 * @param filePath * @return */ public static boolean checkIsAudio(String filePath)throws Exception{ Audio audio = parseAudio(filePath); if(audio.getType()!=null){ String[] formats = {"mp3", "wma", "wav", "amr", "asf"}; for(String format : formats){ if(audio.getType().indexOf(format) > -1){ return true; } else if(audio.getFormat() != null && audio.getFormat().indexOf("wmav2") > -1){ return true; } } } return false; } /** * 校驗檔案是否是視訊 * @param filePath * @return */ public static boolean checkIsVideo(String filePath)throws Exception{ Video video = FFMpegUtils.parseVideo(filePath); if(video.getType()!=null){ String[] formats = {"rm", "rmvb", "wmv", "avi", "mpg", "mpeg", "mp4"}; for(String format : formats){ if(video.getType().indexOf(format) > -1 || video.getVideoFormat().indexOf(format) > -1){ return true; } } } return false; } /** * 獲取檔案字尾 */ public static String getFileExtention(String fileName) { int pos = fileName.lastIndexOf("."); if (pos > -1 && pos < fileName.length()) { return fileName.substring(pos + 1); } return ""; } public static void main(String args[]){ try { // FFMpegUtils.audioTransOgg("F:\\xxx\\xfasfasfffffffff.mp3", "F:\\xxx\\xfasfasfffffffff.ogg"); Audio audio=FFMpegUtils.parseAudio("F:\\xxx\\xfasfasfffffffff.ogg"); FFMpegUtils.audioTransfer("F:\\xxx\\xfasfasfffffffff.ogg", "F:\\xxx\\xfasfasfffffffff.mp3",Integer.valueOf(audio.getBitRate()+""),Integer.valueOf(audio.getFrequency())); }catch (Exception e){ System.out.println(e); } } }
package xx.util; public class Video { public static final int WIDTH = 320; public static final int HEIGHT = 240; public static final String DEFAULT_RESOLUTION = "320*240"; public static final double RATE = (double) WIDTH / HEIGHT; /** * 1M */ public static final int MAX_SIZE = 1024 * 1024 ; /** * 時長 */ private long duration; /** * 位元速率 位元率 */ private long bitRate; /** * 解析度 * @return */ private String resolution; /** * 寬 */ private int width = WIDTH; /** * 高 */ private int height = HEIGHT; /** * 源路徑 */ private String srcFile; /** * 目標路徑 */ private String destFile; /** * 型別 */ private String type; /** * 視訊格式 */ private String videoFormat; /** * 音訊格式 */ private String audioFormat; /** * 封面 */ private String frontCover; /** * 旋轉角度 */ private int rotate; /** * 旋轉 */ private String transpose; /** * 是否可識別 * @return */ private boolean support; public long getDuration() { return duration; } public void setDuration(long duration) { this.duration = duration; } public long getBitRate() { return bitRate; } public void setBitRate(long bitRate) { this.bitRate = bitRate; } public String getResolution() { return resolution; } public void setResolution(String resolution) { this.resolution = resolution; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getVideoFormat() { return videoFormat; } public void setVideoFormat(String videoFormat) { this.videoFormat = videoFormat; } public String getAudioFormat() { return audioFormat; } public void setAudioFormat(String audioFormat) { this.audioFormat = audioFormat; } public boolean isSupport() { return support; } public void setSupport(boolean support) { this.support = support; } public String getFrontCover() { return frontCover; } public void setFrontCover(String frontCover) { this.frontCover = frontCover; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public String getSrcFile() { return srcFile; } public void setSrcFile(String srcFile) { this.srcFile = srcFile; } public String getDestFile() { return destFile; } public void setDestFile(String destFile) { this.destFile = destFile; } /** * 獲取視訊解析度 */ public void setDestResolution(){ this.width = WIDTH; this.height = HEIGHT; String resolution = this.getResolution(); if(resolution!=null && (resolution.indexOf("x")>0 ||resolution.indexOf("*")>0) ){ String sep = resolution.indexOf("x")>0 ? "x" : "*"; String[] nums = resolution.split(sep); if(nums.length == 2){ int sWidth = Integer.parseInt(nums[0].trim()); int sHeight = Integer.parseInt(nums[1].trim()); double sRate = (double) sWidth / sHeight; this.width = sWidth; this.height = sHeight; if(sWidth >= sHeight){ if(sRate > RATE && sWidth > WIDTH){ this.width = WIDTH; this.height = this.width * sHeight / sWidth; } else if(sRate <= RATE && sHeight > HEIGHT){ this.height = HEIGHT; this.width = this.height * sWidth / sHeight; } } else{ if(1/sRate > RATE && sHeight > WIDTH){ this.height = WIDTH; this.width = this.height * sWidth / sHeight; } else if(1/sRate <= RATE && sWidth > HEIGHT){ this.width = HEIGHT; this.height = this.width * sHeight / sWidth; } } if(this.width % 2 !=0){ this.width +=1; } if(this.height % 2 !=0){ this.height +=1; } } } if(this.getRotate()==90 || this.getRotate() == 270){ int tmp = this.width; this.width = this.height; this.height = tmp; } } /** * 獲取封面長寬比例 */ public String getCoverResolution(){ int coverHeight = this.height > HEIGHT ?相關推薦
轉換音訊和視訊ffmpeg
使用之前先把ffmpeg包放入工程的下。確保編譯後在classes層,這裡有我寫的MP3到ogg,ogg到MP3,語音資訊獲取等 package xx.util; import xx.ParameterChecker; import xx.StringUtilsEx; im
【FFMpeg視訊開發與應用基礎】五、呼叫FFMpeg SDK封裝音訊和視訊為視訊檔案
《FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK》視訊教程已經在“CSDN學院”上線,視訊中包含了從0開始逐行程式碼實現FFMpeg視訊開發的過程,歡迎觀看!連結地址:FFMpeg視訊開發與應用基礎——使用FFMpeg工具與SDK
FFmpeg-音訊和視訊應用程式的瑞士軍刀
FFmpeg是一個開源免費跨平臺的視訊和音訊流方案,屬於自由軟體,採用LGPL或GPL許可證(依據你選擇的元件)。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多codec都是從頭開發的。
FFmpeg支援的音訊和視訊編解碼格式
1.音訊格式 Name Encoding Decoding Comments 8SVX exponential X 8SVX fibonacci X AAC EX X encoding supp
小程式音訊和視訊
客戶需求:視訊和音訊只能觀看和收聽前10秒,試聽結束後,提示使用者免費試看結束,需要付費了。 效果圖: WXML: <view> <view class='time'> 當前試看10秒!!! </view>
Html5學習筆記四—播放音訊和視訊檔案
1, 載入音訊檔案: Key word :<audio src=”路徑” controls=”controls”> Src是音訊路徑 ,controls屬性用來提供播放,暫停,音量控制 下面是一個簡單程式碼進行播放本地音訊 <!DOCTYPE HTML&
html5 音訊和視訊
•audio 、video •source l視訊容器 •容器檔案,類似於壓縮了一組檔案 –音訊軌道 –
音訊和視訊sdp
1. 視訊 m=video 1234 RTP/AVP 96 a=rtpmap:96 H264 a=framerate:15c=IN IP4 172.18.168.45 1.m=是媒體級會話的開始處,video:媒體型別 ; 1234:埠
說說如何使用 HTML5 嵌入音訊和視訊(媒體標籤)
HTML5 使用 audio 和 video 元素來嵌入音訊和視訊內容。 另外還提供了與這兩個標籤相關的 JavaScript API,這樣就可以建立我們自己的音視訊控制元件咯: <!-- 嵌入視訊 --> <video id="playe
HTML5實現音訊和視訊嵌入
簡介 HTML5未出來之前,線上的音訊和視訊都是藉助Flash或者第三方工具實現的,現在HTML5也支援了這方面的功能。在一個支援HTML5的瀏覽器中,不需要安裝任何外掛就能播放音訊和視訊。原生的支援音訊和視訊,為HTML5注入了巨大的發展潛力。 html實現音訊嵌入(傳統
-------------別人解決的, rtmp中音訊和視訊資料不對稱導致的卡頓的情況-----------------
轉自:http://www.cnweblog.com/fly2700/archive/2011/12/06/318916.html (原創) 花了5天時間,終於解決了一個bug,心情非常愉快,憋了這麼久,不吐不快。 事情是這樣的,前面跟外地一家公司,開發一個二路RTSP
HTML插入音訊和視訊的最佳方式
最好的 HTML 解決方法 HTML5 + <object> + <embed> <!DOCTYPE html> <html> <body
區分mp4格式裡面mdat中的音訊和視訊資料
stsz Box 00 00 73 D8 size of stsz,20 73 74 73 7A: stsz 00 00 00 00: version 00 00 00 00: sample-size 00 00 1C F1: sample-count 00 00 86 24(從此開始,為當前chu
ffmpeg的那點小事兒--ffmpeg的匯入和視訊解碼,YUV儲存(ffmpeg4.0.2)
一、ffmpeg開發的基本知識瞭解 第一點:一個視訊播放流程 通常看到視訊格式:mp4、mov、flv、wmv等等… 稱之為:封裝格式 第二點:視訊播放器 兩種模
頁面中H5的使用標籤如音訊播放器和視訊播放器
1.音訊播放器使用的標籤為: <audio src="音訊的地址" controls="controls" preload="auto" autoplay="autoplay" loop="loop"> 屬性中src 為音訊的地址路徑,loop 是迴圈播放,如
FFmpeg再學習 -- SDL 環境搭建和視訊顯示
/** * 最簡單的基於FFmpeg的視訊播放器2(SDL升級版) * Simplest FFmpeg Player 2(SDL Update) * * 雷霄驊 Lei Xiaohua * [email protected] * 中國傳媒大學/數字電視技術 * Communication Unive
用ffmpeg命令轉換音訊格式
做杭研、捷通華聲、訊飛識別引擎的識別效果評測時,需要提供音訊物料,與開發溝通時,發現需要pcm格式。然而準備物料時,用iOS、Android手機自帶錄音裝置,分別生成m4a和aac格式音訊。所以,首先要解決如何將.m4a和.aac格式音訊轉化成pcm格式。aac全稱Advan
H5新屬性audio音訊和 video視訊的控制詳解(controls)
1.音訊(audio) <audio controls="controls"> <source src="這裡面放入音訊檔案路徑"></source> </audio> 2.視訊(video) <video con
使用 ffmpeg 進行網路推流:拉流->解封裝->解碼->處理原始資料(音訊、視訊)->編碼->編碼->推流
簡要說明: 1、可拉流:rtmp、rtsp、http 2、可推流: #include "stdafx.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #
PHP中關於頁面展示音訊,視訊和圖片
//這是圖片 <img style="height:280px;width:240px" src=""> //這是視訊 <video width="320" height="240" controls> <source src="