2011-11-03 19 views
6

Konuşma verilerini iletmek için gereken bant genişliğini kaydetmek için ham pcm verilerini uLaw olarak kodlamaya çalışıyorum.Android PCM'den wav dosyasını wav kodlama

This page üzerinde UlawEncoderInputStream adlı bir sınıfla karşılaştım ancak belge yok! :(

yapıcı bir giriş akışı ve (yani her neyse) maksimum pcm değerini alır.

/** 
    * Create an InputStream which takes 16 bit pcm data and produces ulaw data. 
    * @param in InputStream containing 16 bit pcm data. 
    * @param max pcm value corresponding to maximum ulaw value. 
    */ 
    public UlawEncoderInputStream(InputStream in, int max) { 

kodu ile baktıktan sonra ben bir ürünle kullanarak bu "max" değerini hesaplamak gerektiğini şüpheli fonksiyon: maxAbsPcm Sorun şu ki, gerçekten neye geçmek istediğimi anlamadım! Ham pcm'imi sdcard'daki bir dosyaya kaydediyorum, bu yüzden buna geçmek için bir sürekli bellek yerleşik veri dizim yok

/** 
    * 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) { 

Bu kodu kullanmamdaki bir diğer sorun, uLaw verileri için başlık için hangi değerlerin yazılacağından emin değilim. ULaw ile kodlandıktan sonra bayt verilerinin ne kadar olduğunu nasıl belirleyebilirim?

VLC ortam yürütücüsünde oluşturduğum (potansiyel olarak) uLaw kodlanmış dosyalardan birini (dosyayı okumaya çalışacağım tek oyuncum) ve seslerini bozuk, bozuk ve tıklattığını dinledim, ancak yine de sesin dışında.

Dalga başlığımı, Here adresinde bulabileceğiniz WaveHeader adlı bir sınıfa benzer bir kod kullanarak yazıyorum!

herkes bu konuda herhangi bir düşünce varsa ben bunları duymak çok minnettar kalacağım! :)

çok teşekkürler Dexter

+0

Bir .wav dosyası oluşturuyorsanız. Dalga başlığı dosyasını başlangıçta saklayın ve kaydınızın sonunda tekrar değiştirin. Tipik olarak, sonuna ulaşana kadar boyutu (kayıt sayısı) bilmezsiniz. Max'iniz zaten 0x7f olmalıdır. –

cevap

4

yapıcısındaki max PCM verilerinde maksimum genlik olduğunu. Çıkışı üretmeden önce girişi ölçeklemek için kullanılır. Giriş çok yüksekse daha yüksek bir değere ihtiyacınız vardır, eğer sessizse daha düşük bir değere ihtiyacınız vardır. 0'u iletirseniz, kodlayıcı varsayılan olarak 8192 kullanır, bu da yeterince iyi olabilir.

Diğer yöntemde length, maksimum genliği bulmak istediğiniz 16 bitlik örnek sayısıdır. Bu sınıf giriş PCM verilerinin her zaman 16 bitlik örneklerle kodlandığını varsayar, yani her bir örnek iki bayttan oluşur: girişiniz 2000 byte uzunsa 1000 örneğiniz vardır.

Bu sınıftaki enkoder, her 16 bit PCM örneği için bir 8-bit µ-Law örneği üretir, bu nedenle bayt cinsinden boyut yarıya düşer.

+0

Çok teşekkürler Joni –

0

Yapmaya çalıştığınız şeyin tam tersi, ancak birisine yardımcı olabileceğini düşündüm. Burada, bir 8 bit uLaw kodlanmış ikili dosyayı yerleşik Java yöntemlerini kullanarak bir 16 bit WAV dosyasına dönüştürecek bir exmple yöntemidir.

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(); 
    } 
} 
İlgili konular