一.通過JAVE可以實現視頻剪切,壓縮,提取音樂等操作
1.jar包的導入請看這里:https://www.cnblogs.com/KdeS/p/13215089.html
2.JAVE參考文檔:http://www.sauronsoftware.it/projects/jave/manual.php#6
3.jave是對ffmpeg的封裝,ffmpeg的文檔:https://ffmpeg.org/ffmpeg.html
JAVE.jar(官網點我) 是一個封裝了FFmpeg的Java框架,在項目中能直接調用它的API來處理音視頻文件;
優點:使用方便,直接在項目中引入JAVE.jar即可處理媒體文件,且開發完成后可以隨工程一起打包發布,不需要在目標運行環境內手動安裝FFmpeg相關的類庫
缺點:JAVE.jar最后一次更新是2009年,其封裝的FFmpeg版本是09年或更早前的版本,比較老舊,無法使用一些新特性
(當然也可以看看有沒有其他比較新的封裝了FFmpeg的框架)
4.如果jave不滿足功能,可以參考這篇文檔集成ffmpeg:https://www.cnblogs.com/wangsongbai/p/10521834.html
二 .關鍵文檔介紹
音頻/視頻編碼
最重要的JAVE類是it.sauronsoftware.jave.Encoder。編碼器對象公開了許多用於多媒體轉碼的方法。為了使用JAVE,您始終必須創建一個Encoder:
Encoder encoder = new Encoder();
創建實例后,您可以開始調用encode()方法進行轉碼:
public void encode(java.io.File source, java.io.File target, it.sauronsoftware.jave.EncodingAttributes attributes) throws java.lang.IllegalArgumentException, it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException
第一個參數source表示要解碼的源文件。
第二個參數target,是將要創建和編碼的目標文件。
所述屬性參數,其類型為it.sauronsoftware.jave.EncodingAttributes,是含有由編碼器所需要的任何信息的數據結構。
請注意,對encode()的調用是一個阻塞的調用:該方法僅在轉碼操作完成(或失敗)后才返回。如果您有興趣監視代碼轉換操作,請查看“ 監視代碼轉換操作 ”部分。
編碼屬性
要指定有關轉碼操作的首選項,您必須向encode()調用提供it.sauronsoftware.jave.EncodingAttributes實例。您可以創建自己的EncodingAttributes實例,並可以使用以下方法填充它:
public void setAudioAttributes(it.sauronsoftware.jave.AudioAttributes audioAttributes)
設置音頻編碼屬性。如果從未在新的EncodingAttributes實例上調用,或者給定參數為null,則編碼文件中將不包含音頻流。另請參閱“ 音頻編碼屬性 ”。public void setVideoAttributes(it.sauronsoftware.jave.AudioAttributes videoAttributes)
它設置視頻編碼屬性。如果從未在新的EncodingAttributes實例上調用,或者給定參數為null,則編碼文件中將不包含任何視頻流。另請參閱“ 視頻編碼屬性 ”。public void setFormat(java.lang.String format)
它設置將用於新編碼文件的流容器的格式。給定的參數表示格式名稱。編碼格式名稱僅當出現在使用的Encoder實例的getSupportedEncodingFormats()方法返回的列表中時才有效且受支持。public void setOffset(java.lang.Float offset)
它設置代碼轉換操作的偏移量。源文件將從其開始的偏移秒數開始重新編碼。例如,如果您想剪切源文件的前五秒,則應在傳遞給編碼器的EncodingAttributes對象上調用setOffset(5)。public void setDuration(java.lang.Float duration)
它設置代碼轉換操作的持續時間。僅源的持續時間秒數將被重新編碼到目標文件中。例如,如果您想從源中提取並轉碼三十秒的一部分,則應在傳遞給編碼器的EncodingAttributes對象上調用setDuration(30)。
音頻編碼屬性
音頻編碼屬性由it.sauronsoftware.jave.AudioAttributes類的實例表示。此類對象的可用方法是:
public void setCodec(java.lang.String codec)
它設置將用於音頻流的代碼轉換的編解碼器的名稱。您必須從當前Encoder實例的getAudioEncoders()方法返回的列表中選擇一個值。否則,您可以傳遞AudioAttributes.DIRECT_STREAM_COPY特殊值,該值需要從源文件復制原始音頻流。public void setBitRate(java.lang.Integer bitRate)
它為新的重新編碼的音頻流設置比特率值。如果未設置比特率值,則編碼器將選擇默認值。該值應以每秒位數表示。例如,如果您想要128 kb / s的比特率,則應調用setBitRate(new Integer(128000))。public void setSamplingRate(java.lang.Integer bitRate)
它為新的重新編碼的音頻流設置采樣率。如果未設置采樣率值,則編碼器將選擇默認值。該值應以赫茲表示。例如,如果您想要類似CD的44100 Hz采樣率,則應調用setSamplingRate(new Integer(44100))。public void setChannels(java.lang.Integer channels)
它設置將在重新編碼的音頻流中使用的音頻通道數(1 =單聲道,2 =立體聲)。如果未設置任何通道值,則編碼器將選擇默認值。public void setVolume(java.lang.Integer volume)
可以調用此方法來更改音頻流的音量。值為256表示音量不變。因此,小於256的值表示音量減小,而大於256的值將增大音頻流的音量。
視頻編碼屬性
視頻編碼屬性由it.sauronsoftware.jave.VideoAttributes類的實例表示。此類對象的可用方法是:
public void setCodec(java.lang.String codec)
它設置將用於視頻流轉碼的編解碼器的名稱。您必須從當前Encoder實例的getVideoEncoders()方法返回的列表中選擇一個值。否則,您可以傳遞VideoAttributes.DIRECT_STREAM_COPY特殊值,該值需要從源文件復制原始視頻流。public void setTag(java.lang.String tag)
它設置與重新編碼的視頻流關聯的標簽/ fourcc值。如果未設置任何值,則編碼器將選擇默認值。多媒體播放器通常使用標簽值來選擇在流上運行哪個視頻解碼器。在示例中,將使用播放器使用的默認DivX解碼器對帶有“ DIVX”標簽值的MPEG 4視頻流進行解碼。順便說一下,這就是DivX的確切含義:帶有附加的“ DIVX”標簽/ fourcc值的MPEG 4視頻流!public void setBitRate(java.lang.Integer bitRate)
它為新的重新編碼的視頻流設置比特率值。如果未設置比特率值,則編碼器將選擇默認值。該值應以每秒位數表示。例如,如果您想要360 kb / s的比特率,則應調用setBitRate(new Integer(360000))。public void setFrameRate(java.lang.Integer bitRate)
它為新的重新編碼的音頻流設置幀速率值。如果未設置比特率幀速率,則編碼器將選擇默認值。該值應以每秒幀數表示。例如,如果您想要30 f / s的幀速率,則應調用setFrameRate(new Integer(30))。public void setSize(it.sauronsoftware.jave.VideoSize size)
它設置視頻流中圖像的大小和比例。如果未設置任何值,則編碼器將保留原始大小和比例。否則,您可以使用首選大小傳遞 it.sauronsoftware.java.VideoSize實例。您可以使用像素值設置新編碼視頻的寬度和高度,並縮放原始視頻。例如,如果您要將視頻縮放到寬度為512像素,高度為384像素,則應調用setSize(new VideoSize(512,384))。
獲取有關多媒體文件的信息
在對現有多媒體文件進行轉碼之前,可以調用編碼器getInfo()方法來獲取有關現有多媒體文件的信息。該的getInfo()方法為您提供了有關文件和有關其包裹音頻和視頻流所用的容器的信息:
public it.sauronsoftware.jave.MultimediaInfo getInfo(java.io.File source) throws it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException
一個it.sauronsoftware.jave.MultimediaInfo對象使用it.sauronsoftware.jave.AudioInfo和it.sauronsoftware.jave.VideoInfo的實例來封裝有關整個多媒體內容及其流的信息,以描述包裝的音頻和視頻。這些對象類似於 EncodingAttributes,AudioAttributes和VideoAttributes的對象,但是它們以只讀模式工作。查看與JAVE發行版捆綁在一起的JAVE API javadoc文檔,以獲取有關它們的更多詳細信息。
監視轉碼操作
您可以使用偵聽器監視代碼轉換操作。JAVE定義了 it.sauronsoftware.jave.EncoderProgressListener接口。此接口可以由您的應用程序實現,並且可以將具體的EncoderProgressListener實例傳遞給編碼器。每當發生重大事件時,編碼器都會調用您的偵聽器方法。要將EncoderProgressListener傳遞給編碼器,應使用encode()方法的以下定義:
public void encode(java.io.File source, java.io.File target, it.sauronsoftware.jave.EncodingAttributes attributes, it.sauronsoftware.jave.EncoderProgressListener listener) throws java.lang.IllegalArgumentException, it.sauronsoftware.jave.InputFormatException, it.sauronsoftware.jave.EncoderException
要實現EncoderProgressListener接口,您必須定義以下所有方法:
public void sourceInfo(it.sauronsoftware.jave.MultimediaInfo info)
分析源文件后,編碼器將調用此方法。該信息參數是實例 it.sauronsoftware.jave.MultimediaInfo類,它代表了有關源音頻和視頻流及其容器的信息。public void progress(int permil)
每當編碼操作完成時,編碼器都會調用此方法。所述permil參數是表示通過當前操作到達點的值和它的范圍是從0(操作剛開始)到1000(操作完成)。public void message(java.lang.String message)
編碼器調用此方法以通知有關代碼轉換操作的消息(通常,該消息為警告)。
轉碼失敗
當然,轉碼操作可能會失敗。然后encode()方法將傳播一個異常。根據發生的情況,異常將是以下之一:
- java.lang.IllegalArgumentException
因為已將傳遞給編碼器的編碼屬性識別為無效,所以轉碼操作從未開始。通常,當給編碼器的EncodingAttributes實例要求對沒有音頻和視頻流的容器進行編碼時(AudioAttributes和VideoAttribues屬性均為null或未設置),就會發生這種情況。 - it.sauronsoftware.jave.InputFormatException
無法解碼源文件。當解碼器不支持源文件容器,視頻流格式或音頻流格式時,就會發生這種情況。您可以通過調用編碼器方法getSupportedDecodingFormats(),getAudioDecoders()和getVideoDecoders()來檢查受支持的容器和插入的解碼器。 - it.sauronsoftware.jave.EncoderExpection
由於內部錯誤,該操作在轉碼過程中失敗。您應該檢查異常消息,還可以使用EncoderProgressListener實例檢查編碼器發出的任何消息。
三 .demo
@Test public void testAppPush() { //原始文件 File source = new File("D:\\Software\\blibli\\Download\\Av706.mp4"); //新文件 File target = new File("D:\\Software\\blibli\\Download\\test.mp4"); try { //一.音頻編碼設置 AudioAttributes audio = new AudioAttributes(); /** * 它設置將用於音頻流的代碼轉換的編解碼器的名稱。 * 您必須從當前Encoder實例的getAudioEncoders()方法返回的列表中選擇一個值。 * 否則,您可以傳遞AudioAttributes.DIRECT_STREAM_COPY特殊值,該值需要從源文件復制原始音頻流。 * String str[]=new Encoder().getAudioEncoders(); */ audio.setCodec("libmp3lame"); /** * 它為新的重新編碼的音頻流設置比特率值。如果未設置比特率值,則編碼器將選擇默認值。 * 該值應以每秒位數表示。例如,如果您想要128 kb / s的比特率,則應調用setBitRate(new Integer(128000))。 * 這個值越高代表音質越好 */ audio.setBitRate(new Integer(64000)); /** * 它設置將在重新編碼的音頻流中使用的音頻通道數(1 =單聲道,2 =立體聲)。 * 如果未設置任何通道值,則編碼器將選擇默認值。 */ audio.setChannels(new Integer(1)); /** * 它為新的重新編碼的音頻流設置采樣率。 * 如果未設置采樣率值,則編碼器將選擇默認值。該值應以赫茲表示。 * 例如,如果您想要類似CD的44100 Hz采樣率,則應調用setSamplingRate(new Integer(44100))。 * 采樣率和采樣大小的值越大,記錄的波形更接近原始信號。 */ audio.setSamplingRate(new Integer(22050)); /** * 可以調用此方法來更改音頻流的音量。 * 值為256表示音量不變(默認值)。因此,小於256的值表示音量減小,而大於256的值將增大音頻流的音量。 */ audio.setVolume(600); //二.視頻編碼設置 VideoAttributes video = new VideoAttributes(); /** * 它設置將用於視頻流轉碼的編解碼器的名稱。 * 您必須從當前Encoder實例的getVideoEncoders()方法返回的列表中選擇一個值。 * 否則,您可以傳遞VideoAttributes.DIRECT_STREAM_COPY特殊值,該值需要從源文件復制原始視頻流。 * String str[]=new Encoder().getVideoEncoders(); */ video.setCodec("mpeg4"); /** * 它為新的重新編碼的視頻流設置比特率值。 * 如果未設置比特率值,則編碼器將選擇默認值。 * 該值應以每秒位數表示。例如,如果您想要360 kb / s的比特率,則應調用setBitRate(new Integer(360000))。 * 這個值越高代表視頻越清晰 */ video.setBitRate(new Integer(160000)); /** * 它設置與重新編碼的視頻流關聯的標簽/ fourcc值。如果未設置任何值,則編碼器將選擇默認值。 * 多媒體播放器通常使用標簽值來選擇在流上運行哪個視頻解碼器。 * 在示例中,將使用播放器使用的默認DivX解碼器對帶有“ DIVX”標簽值的MPEG 4視頻流進行解碼。 * 順便說一下,這就是DivX的確切含義:帶有附加的“ DIVX”標簽/ fourcc值的MPEG 4視頻流! * * DivX解碼器是兩種AVI格式的一種,用於網絡視頻傳輸。是有損壓縮格式。也是自由軟件,它的另一個是xvid。 */ //video.setTag("DivX"); /** * 它為新的重新編碼的音頻流設置幀速率值。 * 如果未設置比特率幀速率,則編碼器將選擇默認值。 * 該值應以每秒幀數表示。例如,如果您想要30 f / s的幀速率,則應調用setFrameRate(new Integer(30))。 * * 值太小 會成為慢動作 */ video.setFrameRate(new Integer(15)); /** * 它設置視頻流中圖像的大小和比例。 * 如果未設置任何值,則編碼器將保留原始大小和比例。 * 否則,您可以使用首選大小傳遞 it.sauronsoftware.java.VideoSize實例。您可以使用像素值設置新編碼視頻的寬度和高度,並縮放原始視頻。 * 例如,如果您要將視頻縮放到寬度為512像素,高度為384像素,則應調用setSize(new VideoSize(512,384))。 */ video.setSize(new VideoSize(512,384)); // 視頻轉碼編碼設置 EncodingAttributes attrs = new EncodingAttributes(); /** * 設置將用於新編碼文件的流容器的格式。給定的參數表示格式名稱。 * 編碼格式名稱僅當出現在使用的Encoder實例的getSupportedEncodingFormats()方法返回的列表中時才有效且受支持。 * String str[]=new Encoder().getSupportedEncodingFormats(); */ attrs.setFormat("mp4"); /** * 設置音頻編碼屬性。如果從未在新的EncodingAttributes實例上調用,或者給定參數為null,則編碼文件中將不包含音頻流。 * 抽取視頻時不指定即可,無音樂 */ attrs.setAudioAttributes(audio); /** * 設置視頻編碼屬性。如果從未在新的EncodingAttributes實例上調用,或者給定參數為null,則編碼文件中將不包含任何視頻流 * 抽取音頻時不指定參數即可,,無視頻 */ attrs.setVideoAttributes(video); /** * 它設置代碼轉換操作的偏移量。源文件將從其開始的偏移秒數開始重新編碼。 * 例如,如果您想剪切源文件的前五秒,則應在傳遞給編碼器的EncodingAttributes對象上調用setOffset(5)。 * 視頻剪切開始時間 */ attrs.setOffset((float)10); /** * 它設置代碼轉換操作的持續時間。僅源的持續時間秒數將被重新編碼到目標文件中。 * 例如,如果您想從源中提取並轉碼三十秒的一部分,則應在傳遞給編碼器的EncodingAttributes對象上調用 * 圖片剪切多少秒 */ attrs.setDuration((float)10); //三.編碼器 Encoder encoder = new Encoder(); encoder.encode(source, target, attrs); //獲取有關多媒體文件的信息 it.sauronsoftware.jave.MultimediaInfo a=encoder.getInfo(source); System.out.println(a); System.out.println("壓縮完成..."); } catch (EncoderException e) { e.printStackTrace(); } }