1. 程式人生 > >轉換音訊和視訊ffmpeg

轉換音訊和視訊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 每秒幀數(1529.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 每秒幀數(1529.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="