【问题标题】:Am I doing this correctly?我这样做正确吗?
【发布时间】:2012-12-12 06:27:12
【问题描述】:



在寻求帮助之前,让我告诉你我做了什么: 假设我有 8000Hz 的采样率16 位(2 字节)的采样大小,在第二秒结束时,我需要 16000 字节或 8000 字节。
现在我有 10fps 的录制速度,然后对于每个 fps 我需要 16000/10 = 1600 字节。
所以,故事是这样发展的:

变量声明:

byte[] eachPass = new byte[1600]; //used to store data from TargetDataLine for each pass
byte[] backingArray = new byte[16000]; //the complete data for one second
ByteBuffer buffer = ByteBuffer.wrap(backingArray); //buffer which stores the complete data
short[] audioSample = new short[16000/2]; //audio samples to be encoded
int passCounter = 0; /* After 10th pass, convert the byte[] to short[]
                      * using ByteBuffer */
int seconds = 0; // used to store the position of the packet

byte[] 到 short[] 的循环和后续转换

while(keepCapturing == true){
    -- set up the java.awt.Robot and TargetDataLine before entering the loop --
    -- use java.awt.Robot to record the screen --
    -- do some other stuff, if needed --
    fromMic.read(eachPass,0,eachPass.length); // read data from microphone
    buffer.put(eachPass); //put it in  a bigger buffer

    if(passCounter!=0 && passCounter%10==0){ // is it 10th frame?
        passCounter = 0; //reset counter
        seconds++;
        buffer.asShortBuffer.get(audioSamples); //get short[] in BigEndian format
        -- encode the audio at position (seconds-1) --
        buffer.clear();
    }else{
        passCounter++;
    }  

问题

  • 即使buffer.position()if 语句中返回16000,当我执行buffer.asShortBuffer.get(audioSamples); 时,我得到一个BufferUnderflowException

  • 我使用java.util.Arrays.toString() 来查看我的eachPassaudioSamples 包含的内容,我在eachPass 中得到了一些数字,例如-107、0、32 等,在audioSamples 中得到了全零。为什么?
  • 老兵们,你能帮我确定一下这段代码吗?我不知道发生了什么事。

    【问题讨论】:

      标签: java audio byte bytebuffer short


      【解决方案1】:

      你在读取数据之前忘记flip缓冲区,这就是为什么没有写入audioSamples

      buffer.flip();
      buffer.asShortBuffer.get(audioSamples);
      

      【讨论】:

        猜你喜欢
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        • 2023-03-19
        相关资源
        最近更新 更多