1. 程式人生 > >java-FFmpeg(一) 實現視訊的轉碼和截圖功能

java-FFmpeg(一) 實現視訊的轉碼和截圖功能

FFmpeg是一個開源免費跨平臺的視訊和音訊流方案,屬於自由軟體,採用LGPL或GPL許可證(依據你選擇的元件)。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多codec都是從頭開發的。FFmpeg在Linux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行。

  在java開發中,FFmpeg也常被呼叫用來進行視訊的轉碼,錄播和直播,總的來說,FFmpeg是一款非常強大的,而且做與視訊相關的業務平臺開發人員必須要學會的工具,那具體怎麼實習呢,第一章我們先從分別windows和linux下呼叫FFmpeg進行視訊的轉碼,和對視訊的截圖做出說明解釋。

      ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等),而對於ffmpeg無法解析的檔案格式(wmv9,rm,rmvb等),我們在下面採用了mencoder工具,先將視訊轉換成AVI格式再用ffmpeg進行轉碼;

windows下:

1.首先需要FFmpeg和mencoder的工具。一共五個檔案,點此下載,將他解壓放在你的D盤FFmpeg資料夾下。

linux下:

依次執行下面的指令

1.下載yasm-1.3.0.tar.gz這個版本:

?1yasm是一個完全重寫的NASM彙編。目前,它支援x86和AMD64指令集,接受NASM和氣體彙編語法,產出二進位制, ELF32 , ELF64 , COFF , Mach - O的( 32和64 ) , RDOFF2 ,的Win32和Win64物件的格式,並生成STABS 除錯資訊的來源,DWARF 2 ,CodeView 8格式。之所以在FFmpeg中用這個,主要是支援編譯ffmpeg-x264.

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install


2.下載3.1.3 release ffmpeg(時間可能會有點長,耐心等待~!安裝完成之後輸入  ffmpeg -version 可以看到版本說明安裝成功)

wget http://ffmpeg.org/releases/ffmpeg-3.1.3.tar.gz
tar -zxvf ffmpeg-3.1.3.tar.gz
cd ffmpeg-3.1.3
./configure
make
make install
ffmepg命令格式:ffmepg -i filename -vcodec copy newfilename
package test;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;  
  

public class ConvertVideo {
	
	
        public static void main(String[] args) {  
        	String fileName = "192.168.10.1836Time20181213150000Time20181213150010.mp4_";
        	if(args != null && args.length>=1){
        		fileName = args[0];
        	}
        	
        	String path =  Test.TEMP_VIDEO_PATH + File.pathSeparator + fileName;
        	String newPath = Test.TEMP_VIDEO_PATH + File.pathSeparator +  fileName.replace(Test.TEMP_VIDEO_SUFFIX, Test.REAL_VIDEO_SUFFIX);
//        	path = "C:\\download\\192.168.10.1836Time20181213150000Time20181213150010_1544684887325.mp4";
//        	newPath = "/var/log/smartpark/wi.mp4";
        	
            if (ConvertVideo.processMP4(path,newPath)) {        //執行轉碼任務
                System.out.println("ok");  
            }  
        }  
      
        private static boolean checkfile(String path) {  
            File file = new File(path);  
            if (!file.isFile()) { 
            	System.out.println(path + " is not file");  
                return false;  
            }  
            return true;  
        }  
        
        public static boolean processMP4(String filePath, String newfilePath) {  
        	if(!checkfile(filePath)){
        		return false;
        	}
            List<String> commend = new ArrayList<String>();  
            commend.add("/usr/local/bin/ffmpeg");
            commend.add("-i");
            commend.add(filePath);  
            commend.add("–vscodec");
            commend.add("copy");  
            commend.add(newfilePath);  
            try {  
                //呼叫執行緒命令啟動轉碼
                ProcessBuilder builder = new ProcessBuilder();  
                builder.command(commend);  
                Process process = builder.start();
                InputStream in=process.getInputStream();
                byte[] re=new byte[1024];
                while (in.read(re)!= -1) {
                    System.out.println("==>"+new String(re));
                }
                in.close();
                if(process.isAlive()){
                    process.waitFor();
                }
                return true;  
            } catch (Exception e) {  
                e.printStackTrace();  
                return false;  
            }  
        }  
        
}