FFmpeg is a very powerful audio and video processing tool, the official website is: http://ffmpeg.org/.
Because FFmpeg does not have the same files on Windows and on Linux systems (you do not need to install FFmpeg on Windows, you only need to download the Windows version of FFmpeg. Linux requires the user to install ffmpeg---> Reference link: http://linux.it.net.cn/e/Linuxit/2014/0828/3980.html)
The most recent project is a requirement to convert the audio files in the AMR format from Android to MP3 format and then play them on the web.
I. How Windows systems and Linux systems are handled
1, first on the Windows system to solve. There are 2 scenarios, one is to use the Jave.jar Toolkit, the other is to unzip the downloaded version of Windows FFmpeg directly, and then import the Ffmpeg.exe file in the bin directory into the project (or read the local ffmpeg.exe execution file directly using code) )。
1.1. Using the Jave.jar tool kit
http://mfan.iteye.com/blog/2032454
1.2. execute files using Ffmpeg.exe
1.2.1, use local ffmpeg.exe to execute files, get directly through file
1.2.2, import the Ffmpeg.exe executable file into the project, via URL url = thread.currentthread (). Getcontextclassloader (). GetResource ("ffmpeg/ windows/"); To get
1.3. Use FFmpeg on Linux server to convert AMR to mp3
1.3.1, first to install the FFmpeg tool on the Linux server, the installation method is shown above
Second, the Utils tool class (Code specific implementation)
* *
* Create By yxl on 2018/6/5
* /
public class AmrToMP3Utils {
private static Logger logger =Logger.getLogger(AmrToMP3Utils.class);
* *
*Convert AMR file input to MP3 format
* @param file
* @return
* /
public static InputStream amrToMP3(MultipartFile file) {
String ffmpegPath = getLinuxOrWindowsFfmpegPath();
Runtime runtime = Runtime.getRuntime();
Try {
String filePath = copyFile(file.getInputStream(), file.getOriginalFilename());
String substring = filePath.substring(0, filePath.lastIndexOf("."));
String mp3FilePath = substring + ".mp3";
//Execute ffmpeg file, change AMR format to MP3
//Filepath ----- > address of AMR file in temporary folder
//Mp3 filepath ----- > the address of the converted MP3 file
Process P = runtime.exec (ffmpegpath + "ffmpeg - I" + filepath + "" + mp3filepath); / / execute ffmpeg.exe, with the address of ffmpeg.exe in the front, the address of the file to be converted in the middle, and the address of the converted file in the back. -I is the conversion mode, which means that it can be encoded and decoded. The MP3 encoding mode is libmp3 lame
//Release process
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
P.waitFor ();
File mp3File = new File(mp3FilePath);
InputStream fileInputStream = new FileInputStream(mp3File);
//The input stream should be closed where the method is called (after use), and the corresponding files under the temporary folder should be deleted
/*File amrFile = new File(filePath);
File mp3File = new File(mp3FilePath);
if (amrFile.exists()) {
boolean delete = amrFile.delete();
System. Out. Println ("delete source file:" + delete);
}
if (mp3File.exists()) {
boolean delete = mp3File.delete();
System. Out. Println ("delete MP3 file:" + delete);
* *
return fileInputStream;
} catch (Exception e) {
e.printStackTrace();
} finally {
runtime.freeMemory();
}
Return null;
}
* *
*Transfer AMR file input to MP3 format
*Input stream of @ param InputStream AMR file (it can also be other file streams)
*@ param filename filename (including suffix)
* @return
* /
public static InputStream amrToMP3(InputStream inputStream, String fileName) {
String ffmpegPath = getLinuxOrWindowsFfmpegPath();
Runtime runtime = Runtime.getRuntime();
Try {
String filePath = copyFile(inputStream, fileName);
String substring = filePath.substring(0, filePath.lastIndexOf("."));
String mp3FilePath = substring + ".mp3";
//Execute ffmpeg file, change AMR format to MP3
//Filepath ----- > address of AMR file in temporary folder
//Mp3 filepath ----- > the address of the converted MP3 file
Process P = runtime.exec (ffmpeg path + "ffmpeg - I" + "" + filepath + "" + mp3filepath); / / execute ffmpeg.exe, with the address of ffmpeg.exe in the front, the address of the file to be converted in the middle, and the address of the converted file in the back. -I is the conversion mode, which means that it can be encoded and decoded. The MP3 encoding mode is libmp3 lame
//Release process
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
P.waitFor ();
File file = new File(mp3FilePath);
InputStream fileInputStream = new FileInputStream(file);
//The input stream should be closed where the method is called (after use), and the corresponding files under the temporary folder should be deleted
/*File amrFile = new File(filePath);
File mp3File = new File(mp3FilePath);
if (amrFile.exists()) {
boolean delete = amrFile.delete();
System. Out. Println ("delete source file:" + delete);
}
if (mp3File.exists()) {
boolean delete = mp3File.delete();
System. Out. Println ("delete MP3 file:" + delete);
* *
return fileInputStream;
} catch (Exception e) {
e.printStackTrace();
} finally {
runtime.freeMemory();
}
Return null;
}
* *
*Transfer the AMR audio file input by the user to the audio file and store it in the temporary folder
*@ param InputStream
*@ param filename file name
*@ return AMR temporary file storage address
* @throws IOException
* /
private static String copyFile(InputStream inputStream, String fileName) throws IOException {
Properties props = System.getProperties();
String filepath = props. Getproperty ("user. Home") + file. Separator + "mp3tempfile"; / / create a temporary directory
File dir = new File(filePath);
if (!dir.exists()) {
Dir.mkdir ();
}
String outPutFile = dir + File.separator + fileName;
OutputStream outputStream = new FileOutputStream(outPutFile);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
outputStream.close();
inputStream.close();
return outPutFile;
}
* *
*Judge whether the system is windows or Linux and splice ffmpegpath
* @return
* /
private static String getLinuxOrWindowsFfmpegPath() {
String ffmpegPath = "";
String osName = System.getProperties().getProperty("os.name");
if (osName.toLowerCase().indexOf("linux") >= 0) {
ffmpegPath = "";
} else {
URL url = Thread.currentThread().getContextClassLoader().getResource("ffmpeg/windows/");
if (url != null) {
ffmpegPath = url.getFile();
}
}
return ffmpegPath;
}
}
Use FFmpeg in Java to convert AMR-formatted voice to MP3 format