2016-08-24 17 views
1

多くの研究の後、私は明確な答えを見つけることができません。私が達成したいのは、mp3/wavファイルを取り出し、その左右のチャンネルを2バイト[]に保存することです。その後、各チャンネルを操作してから再び追加して、新しいwavファイルを作成することができます。 (できればJavaの解決策)音声ファイルが左右チャンネルを取得

関連する質問はsplit two channels of AudioRecord of CHANNEL_IN_STEREOです。しかし、これはaudiorecordを使用して、それをオーディオファイルからの読み込みにどのように適用するのですか? http://freewavesamples.com/korg-triton-slow-choir-st-c4

データ16ビットステレオPCM用パッキン:

おかげ

さてここで

答えて

1

サンプルオーディオ16ビットのwaveファイルを読むためのプログラムである サンプル1


チャネル0 |チャンネル0 |チャンネル1 |チャンネル1

(左)| (左)| (右)| (右)

低次|高次|下位|高位

バイト|バイト|バイト|バイト


そして、それをCSV形式で印刷します。私はCSVライターのコードをここには載せません。すでに利用可能です。

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.UnsupportedEncodingException; 

public class AudioReader { 

    class WavHeader { 
     public byte[] RIFF_ID = new byte[4]; // "riff" 
     public int SIZE; // 
     public byte[] WAV_ID = new byte[4]; // "WAVE" 
     public byte[] FMT_ID = new byte[4]; // "fmt id" 
     public int FMT_SZ; // fmt 
     public int FORMAT; // 
     public short CHANNELS; // Channels 
     public int SAMPLE_PER_SEC; // Sample per second 
     public int AVGBYTE_PER_SEC; // Average Byte per second 
     public short BLOCK_SZ; // CHANNELS * (BIT>>3) 
     public short BIT; // BITS 
     public byte[] DATA_ID = new byte[4]; // "data" 
     public int DATA_SZ; // 
    } 

    String m_strFileName; 
    WavHeader m_objHeader; 

    public AudioReader(String strFileName) { 
     m_strFileName = strFileName; 
     m_objHeader = new WavHeader(); 
    } 

    private void printHeaderBigEndian(int nSamples) { 
     try { 
      // 1 
      String str1 = new String(m_objHeader.RIFF_ID, "ISO-8859-1"); 
      System.out.println("Riff Id: " + str1); 
      // 2 
      System.out.println("Size: " + m_objHeader.SIZE); 
      // 3 
      String str2 = new String(m_objHeader.WAV_ID, "ISO-8859-1"); 
      System.out.println("Wav Id: " + str2); 
      // 3 
      String str3 = new String(m_objHeader.FMT_ID, "ISO-8859-1"); 
      System.out.println("Fmt Id: " + str3); 
      // 4 
      System.out.println("Format: " + m_objHeader.FORMAT); 
      // 5 
      System.out.println("Channels: " + m_objHeader.CHANNELS); 
      // 6 
      System.out.println("Sample per sec: " + m_objHeader.SAMPLE_PER_SEC); 
      // 7 
      System.out.println("Avg Byte per sec: " 
        + m_objHeader.AVGBYTE_PER_SEC); 
      // 8 
      System.out.println("Block Sz: " + m_objHeader.BLOCK_SZ); 
      // 9 
      System.out.println("Bit: " + m_objHeader.BIT); 
      // 10 
      String str4 = new String(m_objHeader.DATA_ID, "ISO-8859-1"); 
      System.out.println("Data Id: " + str4); 
      // 11 
      System.out.println("Data Sz: " + m_objHeader.DATA_SZ); 
      // 12 
      System.out.println("Samples: " + nSamples); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    // //////////////////////////////////////////////////////////////////////////////////// 
    // 
    public void ReadUsingDataInputStream() { 
     try { 
      File in = new File(m_strFileName); 
      FileInputStream fis = new FileInputStream(in); 
      DataInputStream dis = new DataInputStream(fis); 

      dis.read(m_objHeader.RIFF_ID, 0, 4); 
      m_objHeader.SIZE = Integer.reverseBytes(dis.readInt()); 
      dis.read(m_objHeader.WAV_ID, 0, 4); 
      dis.read(m_objHeader.FMT_ID, 0, 4); 
      m_objHeader.FMT_SZ = Integer.reverseBytes(dis.readInt()); 
      m_objHeader.FORMAT = Short.reverseBytes(dis.readShort()); 
      m_objHeader.CHANNELS = Short.reverseBytes(dis.readShort()); 
      m_objHeader.SAMPLE_PER_SEC = Integer.reverseBytes(dis.readInt()); 
      m_objHeader.AVGBYTE_PER_SEC = Integer.reverseBytes(dis.readInt()); 
      m_objHeader.BLOCK_SZ = Short.reverseBytes(dis.readShort()); 
      m_objHeader.BIT = Short.reverseBytes(dis.readShort()); 
      dis.read(m_objHeader.DATA_ID, 0, 4); 
      m_objHeader.DATA_SZ = Integer.reverseBytes(dis.readInt()); 

      int nSamples = m_objHeader.DATA_SZ/m_objHeader.BLOCK_SZ; 
      printHeaderBigEndian(nSamples); 

      String strCsvFileName = in.getParent() + "//" + in.getName() 
        + ".csv"; 

      String strLine[] = new String[3]; 

      File out = new File(strCsvFileName); 
      out.createNewFile(); 
      FileWriter fw = new FileWriter(out); 
      CSVWriter csvW = new CSVWriter(fw); 

      for (int n = 1; n < nSamples; n++) { 
       strLine[0] = Integer.toString(n); 
       strLine[1] = Short.toString(Short.reverseBytes(dis.readShort())); 
       strLine[2] = Short.toString(Short.reverseBytes(dis.readShort())); 
       csvW.writeNext(strLine); 
      } 

      dis.close(); 
      csvW.Close(); 

      System.out.println("Done....."); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
関連する問題