Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android PCM到Ulaw编码wav文件_Java_Android_Encoding_Pcm - Fatal编程技术网

Java Android PCM到Ulaw编码wav文件

Java Android PCM到Ulaw编码wav文件,java,android,encoding,pcm,Java,Android,Encoding,Pcm,我试图将原始pcm数据编码为uLaw,以节省传输语音数据所需的带宽 我在上遇到了一个名为UlawEncoderInputStream的类,但没有文档!:( 构造函数获取一个输入流和一个最大pcm值(不管是什么) 看完代码后,我怀疑我应该使用提供的函数计算这个“max”值:maxAbsPcm。问题是,我真的不明白我要传递给它的是什么!我正在将我的原始pcm记录到SD卡上的一个文件中,所以我没有一个连续的内存驻留数据数组来传递给它 /** * Compute the maximum o

我试图将原始pcm数据编码为uLaw,以节省传输语音数据所需的带宽

我在上遇到了一个名为UlawEncoderInputStream的类,但没有文档!:(

构造函数获取一个输入流和一个最大pcm值(不管是什么)

看完代码后,我怀疑我应该使用提供的函数计算这个“max”值:maxAbsPcm。问题是,我真的不明白我要传递给它的是什么!我正在将我的原始pcm记录到SD卡上的一个文件中,所以我没有一个连续的内存驻留数据数组来传递给它

  /**
     * Compute the maximum of the absolute value of the pcm samples.
     * The return value can be used to set ulaw encoder scaling.
     * @param pcmBuf array containing 16 bit pcm data.
     * @param offset offset of start of 16 bit pcm data.
     * @param length number of pcm samples (not number of input bytes)
     * @return maximum abs of pcm data values
     */
    public static int maxAbsPcm(byte[] pcmBuf, int offset, int length) {
使用此代码的另一个问题是,我不确定要为uLaw数据的头写入哪些值。如何确定使用uLaw编码后字节数据减少了多少

我听过我在VLC media player中创建的一个(可能是)uLaw编码的文件(我拥有的唯一一个尝试读取该文件的播放器),它的声音很难听、破碎、咔嚓咔嚓,但仍然可以辨认出声音

我正在使用类似于我发现的名为WaveHeader的类的代码编写我的WaveHeader,该类可以找到

如果有人对这件事有任何想法,我将不胜感激

非常感谢
Dexter

构造函数中的
max
是PCM数据中的最大振幅。它用于在生成输出之前缩放输入。如果输入的声音很大,你需要一个更高的值,如果它很安静,你需要一个更低的值。如果传入
0
,编码器将默认使用
8192
,这可能已经足够好了

另一种方法中的
length
是要从中找到最大振幅的16位采样数。此类假设输入PCM数据始终使用16位样本编码,这意味着每个样本跨越两个字节:如果输入长度为2000字节,则有1000个样本


此类中的编码器为每16位PCM样本生成一个8位µ-Law样本,因此以字节为单位的大小减半。

这与您尝试的相反,但我认为这可能会对某些人有所帮助。下面是一个示例方法,它将使用内置Java方法将8位uLaw编码的二进制文件转换为16位WAV文件

public static void convertULawFileToWav(String filename) {
    File file = new File(filename);
    if (!file.exists())
        return;
    try {
        long fileSize = file.length();
        int frameSize = 160;
        long numFrames = fileSize / frameSize;
        AudioFormat audioFormat = new AudioFormat(Encoding.ULAW, 8000, 8, 1, frameSize, 50, true);
        AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file), audioFormat, numFrames);
        AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\file.wav"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果您正在创建.wav文件。将wave头文件存储在开始处,并在录制结束时将其更改回原处。通常,在到达末尾之前,您不知道大小(记录数)。无论如何,您的最大值应该是0x7f。
public static void convertULawFileToWav(String filename) {
    File file = new File(filename);
    if (!file.exists())
        return;
    try {
        long fileSize = file.length();
        int frameSize = 160;
        long numFrames = fileSize / frameSize;
        AudioFormat audioFormat = new AudioFormat(Encoding.ULAW, 8000, 8, 1, frameSize, 50, true);
        AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file), audioFormat, numFrames);
        AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\file.wav"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}