2010-10-13 31 views
23

Tôi đang làm việc với Android, cố gắng làm cho ứng dụng AudioTrack của tôi phát tệp .wav của Windows (Tada.wav). Thành thật mà nói, nó không phải là khó khăn, nhưng tôi nghe rất nhiều thứ kỳ lạ. Các tập tin được lưu trên thẻ SD mini của điện thoại của tôi và đọc nội dung không có vẻ là một vấn đề, nhưng khi tôi chơi các tập tin (với các thông số tôi chỉ PRETTY SURE là đúng), tôi nhận được một vài giây của tiếng ồn trắng trước khi âm thanh dường như giải quyết chính nó vào một cái gì đó mà chỉ có thể đúng.Sử dụng AudioTrack trong Android để phát tệp WAV

tôi đã ghi nhận thành công và chơi giọng điệu của mình trở lại trên điện thoại - Tôi tạo ra một tập tin .pcm theo các hướng dẫn trong ví dụ này:

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(mà không có mặt nạ ngược) ..

Bất kỳ ai cũng có một số đề xuất hoặc nhận thức về ví dụ trên web để phát tệp .wav trên Android?

Cảm ơn, R.

Trả lời

26

Tôi vấp vào câu trả lời (thẳng thắn, bằng cách cố gắng &^@ Tôi không nghĩ sẽ làm việc!), Trong trường hợp ai là quan tâm ... Trong mã ban đầu của tôi (được lấy từ ví dụ trong liên kết trong bài đăng gốc), dữ liệu được đọc từ tệp như vậy:

InputStream    is = new FileInputStream  (file); 
    BufferedInputStream  bis = new BufferedInputStream (is, 8000); 
    DataInputStream   dis = new DataInputStream  (bis);  // Create a DataInputStream to read the audio data from the saved file 

    int i = 0;               // Read the file into the "music" array 
    while (dis.available() > 0) 
    { 
     music[i] = dis.readShort();          // This assignment does not reverse the order 
     i++; 
    } 

    dis.close();              // Close the input stream 

Trong phiên bản này, nhạc [] là mảng của SHORTS. Vì vậy, phương thức readShort() dường như có ý nghĩa ở đây, vì dữ liệu là PCM 16 bit ... Tuy nhiên, trên Android có vẻ là vấn đề. Tôi đã thay đổi mã đó thành như sau:

 music=new byte[(int) file.length()];//size & length of the file 
    InputStream    is = new FileInputStream  (file); 
    BufferedInputStream  bis = new BufferedInputStream (is, 8000); 
    DataInputStream   dis = new DataInputStream  (bis);  // Create a DataInputStream to read the audio data from the saved file 

    int i = 0;               // Read the file into the "music" array 
    while (dis.available() > 0) 
    { 
     music[i] = dis.readByte();          // This assignment does not reverse the order 
     i++; 
    } 

    dis.close();              // Close the input stream 

Trong phiên bản này, nhạc [] là một mảng BYTES. Tôi vẫn nói với AudioTrack rằng đó là dữ liệu PCM 16 bit, và Android của tôi dường như không có vấn đề với việc viết một mảng byte vào một AudioTrack do đó được định cấu hình ... Dù sao, nó cuối cùng cũng đúng, vì vậy nếu có ai người khác muốn chơi âm thanh Windows trên Android của họ, vì lý do nào đó, đó là giải pháp. Ah, Endian ......

R.

+0

Đây phải là câu trả lời được chấp nhận vì câu trả lời cho câu hỏi. ;) – gary

+0

Tôi có thể thề rằng tôi đã để lại một "Cảm ơn, Gary" ngay tại đây, nhưng nó không có ở đây bây giờ ... Cảm ơn bạn, Gary !! – Rich

+1

[Bài viết] này (http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java) dường như là về chủ đề: sự khác biệt giữa việc sử dụng ngắn và byte của Java khi đọc định dạng WAV. – Vanja

5

Bạn đang bỏ qua 44 byte đầu tiên của tập tin trước khi bạn đổ phần còn lại của dữ liệu của tập tin vào bộ đệm? 44 byte đầu tiên là tiêu đề WAVE và chúng sẽ phát ra âm thanh ngẫu nhiên nếu bạn cố gắng phát chúng.

Ngoài ra, bạn có chắc bạn đang tạo AudioTrack với các thuộc tính giống như WAVE bạn đang cố gắng phát (tỷ lệ mẫu, tốc độ bit, số kênh, v.v ...) không? Windows thực sự làm một công việc tốt về cung cấp thông tin này cho bạn trong trang tập tin thuộc tính: alt text

+0

Tôi đã thử mọi kết hợp bỏ qua tiêu đề và không phải là tôi có thể nghĩ - không có nhiều may mắn. Âm thanh tiếng ồn trắng kéo dài MUCH dài hơn 44 lần cắn. Tada.wav là một tập tin 168 kByte, do đó, "chơi" tiêu đề nên hầu như không đáng chú ý, phải không? – Rich

+1

Đúng, tiêu đề tệp sẽ tạo ra rác trong một thời gian rất ngắn. Bạn có chắc bạn đang tạo AudioTrack với các thuộc tính giống như WAVE bạn đang cố gắng phát (tỷ lệ mẫu, tốc độ bit, số kênh, v.v ...) không? –

+0

Tôi có một trình chỉnh sửa hex và tôi chắc chắn rằng tôi sẽ nhận được các con số nằm ngoài tiêu đề đúng cách. Tôi rất ngạc nhiên khi tôi không thể tìm thấy một bộ phân tích tệp wav nào đó trên Internet. Tôi đang bối rối, và trình phát Windows Media chắc chắn có thể phát tệp ... – Rich

2

Như đã nói bởi Aaron C, bạn phải bỏ ban đầu 44 byte hoặc (như tôi thích) đọc 44 byte đầu tiên có tiêu đề WAVE. Bằng cách này, bạn biết có bao nhiêu kênh, bit trên mỗi mẫu, độ dài, vv ... WAVE chứa.

Here bạn có thể tìm thấy triển khai tốt trình phân tích cú pháp/trình soạn thảo tiêu đề WAVE.

5

Tôi tìm thấy rất nhiều câu trả lời dài cho câu hỏi này.giải pháp cuối cùng của tôi, mà cho tất cả các cắt và dán là khó tôi, đi xuống đến:

public boolean play() { 

    int i = 0; 
    byte[] music = null; 
    InputStream is = mContext.getResources().openRawResource(R.raw.noise); 

    at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 
     minBufferSize, AudioTrack.MODE_STREAM); 

    try{ 
     music = new byte[512]; 
     at.play(); 

     while((i = is.read(music)) != -1) 
      at.write(music, 0, i); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    at.stop(); 
    at.release(); 
    return STOPPED; 
} 

STOPPED chỉ là một "true" gửi lại như một tín hiệu để thiết lập lại nút tạm dừng/phát. Và trong trình khởi tạo lớp:

public Mp3Track(Context context) { 
    mContext = context; 
    minBufferSize = AudioTrack.getMinBufferSize(44100, 
     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 
} 

Bối cảnh chỉ là "này" từ hoạt động gọi điện. Bạn có thể sử dụng FileInputStream trên sdcard, v.v. Các tệp của tôi ở dạng res/raw

+0

Cảm ơn điều này, trong số tất cả các câu trả lời tôi đã cố gắng này đã cho kết quả tốt nhất. Mặc dù tôi vẫn nhận được một ít nhấp chuột âm thanh khi bản nhạc bắt đầu .... – methodMan

1

Vui lòng không duy trì mã phân tích khủng khiếp. Phân tích cú pháp WAV là tầm thường để triển khai http://soundfile.sapp.org/doc/WaveFormat/ và bạn sẽ cảm ơn bản thân bằng cách phân tích cú pháp như tỷ lệ lấy mẫu, độ sâu bit và số kênh.

Ngoài ra x86 và ARM (ít nhất là theo mặc định) đều là phần cuối nhỏ, vì vậy các tệp WAV gốc phải ổn mà không bị xáo trộn.

+0

Câu trả lời của bạn sẽ hữu ích hơn nếu bạn chỉ định mã phân tích nào bạn cho là khủng khiếp và tại sao. – arlomedia

Các vấn đề liên quan