Java 将.pcm文件转换为.wav文件
我需要在我的Android应用程序中将.pcm转换为.wav文件。PCM音频记录是原始数字音频样本。以前,PCM音频文件的采样频率为16000,以单通道模式(channelConfigurationRecord=AudioFormat.channel\u in_MONO)记录,样本中16位(audioEncoding=AudioFormat.ENCODING_PCM\u 16BIT)。 要将PCM转换为WAV,我需要先写一个标题,然后添加所有PCM数据。我花了很多时间在这上面,我尝试了很多变体,但都不起作用。我不知道我做错了什么。。。 救救我Java 将.pcm文件转换为.wav文件,java,android,wav,pcm,audio-converter,Java,Android,Wav,Pcm,Audio Converter,我需要在我的Android应用程序中将.pcm转换为.wav文件。PCM音频记录是原始数字音频样本。以前,PCM音频文件的采样频率为16000,以单通道模式(channelConfigurationRecord=AudioFormat.channel\u in_MONO)记录,样本中16位(audioEncoding=AudioFormat.ENCODING_PCM\u 16BIT)。 要将PCM转换为WAV,我需要先写一个标题,然后添加所有PCM数据。我花了很多时间在这上面,我尝试了很多变体,
输入数据是未经处理的pcm样本,创建和写入此外壳后,任何播放机都无法识别该文件首先添加FFMPEG库,该库可轻松转换、合并、混合视频和音频 build.gradle(应用程序) 活动
File yourPcmFile = new File("YOUR_PCM_FILE_ABSOLUTE_PATH");
File yourWawOutput = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/output.wav");
String command = "-f s16le -ar 44.1k -ac 2 -i "+yourPcmFile.getAbsolutePath()+ yourWawOutput.getAbsolutePath();
FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onFailure() {
}
@Override
public void onSuccess() {
}
@Override
public void onFinish() {
}
});
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
try {
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
dialog.show();
}
@Override
public void onProgress(String message) {
}
@Override
public void onFailure(String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onSuccess(String message) {
Toast.makeText(context, "Build has been successful", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onFinish() {
}
});
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
} finally {
if (ffmpeg.isFFmpegCommandRunning()) {
ffmpeg.killRunningProcesses();
清单
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
该文件是在实例化FileOutputStream对象时创建的。如果文件已存在,则会覆盖该文件 您正在创建文件两次 一次在writeHeader()函数中,一次在writePCM()函数中
当您写入PCM数据时,您正在覆盖您写入的头数据,并且最后只得到另一个PCM文件。此代码会产生什么结果?为什么这是错误的?请解释输出的问题,和/或完整引用任何错误。输入数据是未经处理的pcm样本,创建和写入此外壳后,任何播放器都无法识别该文件使用ffmpeg库和COM,是否可以在没有其他库的情况下执行此操作?
File yourPcmFile = new File("YOUR_PCM_FILE_ABSOLUTE_PATH");
File yourWawOutput = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/output.wav");
String command = "-f s16le -ar 44.1k -ac 2 -i "+yourPcmFile.getAbsolutePath()+ yourWawOutput.getAbsolutePath();
FFmpeg ffmpeg = FFmpeg.getInstance(context);
try {
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
@Override
public void onStart() {
}
@Override
public void onFailure() {
}
@Override
public void onSuccess() {
}
@Override
public void onFinish() {
}
});
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
try {
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
@Override
public void onStart() {
dialog.show();
}
@Override
public void onProgress(String message) {
}
@Override
public void onFailure(String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onSuccess(String message) {
Toast.makeText(context, "Build has been successful", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
@Override
public void onFinish() {
}
});
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
} finally {
if (ffmpeg.isFFmpegCommandRunning()) {
ffmpeg.killRunningProcesses();
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-f s16le -ar 44.1k -ac 2 -i "+yourPcmFile.getAbsolutePath()+ yourWawOutput.getAbsolutePath()
-f s16le >>> signed 16-bit little endian samples
-ar 44.1k >>> sample rate 44.1kHz
-ac 2 >>> 2 channels (stereo)
-i yourPcmFile.getAbsolutePath() >>> input file
yourWawOutput.getAbsolutePath() >>> output file