Java 将.pcm文件转换为.wav文件

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数据。我花了很多时间在这上面,我尝试了很多变体,

我需要在我的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