java音訊格式轉碼
阿新 • • 發佈:2018-12-17
APP端錄製的音訊不是mp3,在audio標籤無法播放,直接轉為mp3就可以咯
package com.video.util; import org.bytedeco.javacpp.avcodec; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.FrameGrabber; import org.bytedeco.javacv.FrameRecorder; import org.bytedeco.javacv.FrameRecorder.Exception; /** * 音訊引數轉換(包含取樣率、編碼,位數,通道數) * */ public class AudioConvert { /** * 通用音訊格式引數轉換 * * @param inputFile * -匯入音訊檔案 * @param outputFile * -匯出音訊檔案 * @param audioCodec * -音訊編碼 * @param sampleRate * -音訊取樣率 * @param audioBitrate * -音訊位元率 */ public static void convert(String inputFile, String outputFile, int audioCodec, int sampleRate, int audioBitrate, int audioChannels) { Frame audioSamples = null; // 音訊錄製(輸出地址,音訊通道) FFmpegFrameRecorder recorder = null; //抓取器 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile); // 開啟抓取器 if (start(grabber)) { recorder = new FFmpegFrameRecorder(outputFile, audioChannels); recorder.setAudioOption("crf", "0"); recorder.setAudioCodec(audioCodec); recorder.setAudioBitrate(audioBitrate); recorder.setAudioChannels(audioChannels); recorder.setSampleRate(sampleRate); recorder.setAudioQuality(0); recorder.setAudioOption("aq", "10"); // 開啟錄製器 if (start(recorder)) { try { // 抓取音訊 while ((audioSamples = grabber.grab()) != null) { recorder.setTimestamp(grabber.getTimestamp()); recorder.record(audioSamples); } } catch (org.bytedeco.javacv.FrameGrabber.Exception e1) { System.err.println("抓取失敗"); } catch (Exception e) { System.err.println("錄製失敗"); } stop(grabber); stop(recorder); } } } public static boolean start(FrameGrabber grabber) { try { grabber.start(); return true; } catch (org.bytedeco.javacv.FrameGrabber.Exception e2) { try { System.err.println("首次開啟抓取器失敗,準備重啟抓取器..."); grabber.restart(); return true; } catch (org.bytedeco.javacv.FrameGrabber.Exception e) { try { System.err.println("重啟抓取器失敗,正在關閉抓取器..."); grabber.stop(); } catch (org.bytedeco.javacv.FrameGrabber.Exception e1) { System.err.println("停止抓取器失敗!"); } } } return false; } public static boolean start(FrameRecorder recorder) { try { recorder.start(); return true; } catch (Exception e2) { try { System.err.println("首次開啟錄製器失敗!準備重啟錄製器..."); recorder.stop(); recorder.start(); return true; } catch (Exception e) { try { System.err.println("重啟錄製器失敗!正在停止錄製器..."); recorder.stop(); } catch (Exception e1) { System.err.println("關閉錄製器失敗!"); } } } return false; } public static boolean stop(FrameGrabber grabber) { try { grabber.flush(); grabber.stop(); return true; } catch (org.bytedeco.javacv.FrameGrabber.Exception e) { return false; } finally { try { grabber.stop(); } catch (org.bytedeco.javacv.FrameGrabber.Exception e) { System.err.println("關閉抓取器失敗"); } } } public static boolean stop(FrameRecorder recorder) { try { recorder.stop(); recorder.release(); return true; } catch (Exception e) { return false; } finally { try { recorder.stop(); } catch (Exception e) { } } } }
首先得引入依賴了
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacpp</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>opencv-platform</artifactId> <version>3.4.1-1.4.1</version> </dependency> <dependency> <groupId>org.bytedeco.javacpp-presets</groupId> <artifactId>ffmpeg-platform</artifactId> <version>3.4.2-1.4.1</version> </dependency>