1. 程式人生 > >java音訊格式轉碼

java音訊格式轉碼

  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>