2009-06-02 43 views
14

Tôi đang làm việc trên một ứng dụng phải xử lý các tệp âm thanh. Khi sử dụng các tập tin mp3 tôi không chắc chắn làm thế nào để xử lý dữ liệu (dữ liệu tôi quan tâm là các byte âm thanh, những người đại diện cho những gì chúng ta nghe).Cách nhận dữ liệu âm thanh từ MP3?

Nếu tôi đang sử dụng tệp wav, tôi biết tôi có tiêu đề 44 byte và sau đó là dữ liệu. Khi nói đến một mp3, tôi đã đọc rằng chúng được tạo thành bởi các khung hình, mỗi khung có chứa một dữ liệu đầu trang và âm thanh. Có thể lấy tất cả dữ liệu âm thanh từ một tệp mp3 không?

Tôi đang sử dụng java (tôi đã thêm MP3SPI, Jlayer và Tritonus) và tôi có thể lấy các byte từ tệp, nhưng tôi không chắc chắn về những byte này đại diện hoặc cách xử lý .

Trả lời

26

Từ documentation for MP3SPI:

File file = new File(filename); 
AudioInputStream in= AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
              baseFormat.getSampleRate(), 
              16, 
              baseFormat.getChannels(), 
              baseFormat.getChannels() * 2, 
              baseFormat.getSampleRate(), 
              false); 
din = AudioSystem.getAudioInputStream(decodedFormat, in); 

Sau đó bạn chỉ cần đọc dữ liệu từ din - nó sẽ là "thô" dữ liệu theo decodedFormat. (Xem docs for AudioFormat để biết thêm thông tin.)

(Lưu ý rằng mẫu mã này không đóng dòng hoặc bất cứ điều gì như thế -. Sử dụng thích hợp try/cuối cùng khối như bình thường)

+0

Xin chào Jon, Cảm ơn câu trả lời nhanh của bạn! Trong đề xuất của bạn; 'decodedFormat' đại diện cho dữ liệu mp3 được giải mã ở định dạng khác không? nếu tôi viết "din.read()", tôi có nhận được byte dữ liệu ở định dạng được giải mã lần thứ không? Cảm ơn – dedalo

+0

Có. Đó decodedFormat nói "Tôi muốn bạn giải mã như dữ liệu PCM đã ký". –

+0

Xin chào. Tôi theo lời khuyên của bạn và nó đã hoạt động. Để hiển thị dữ liệu tôi sử dụng: khi ((numBytesRead = din.read (audioBytes))! = -1) {} Điều này đọc các byte trong 'din' và lưu chúng trong mảng audioBytes. Tôi đã cố gắng visualizinf dữ liệu bằng cách sử dụng: while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Bytes Decoded value" + audioBytes [0]);} Tôi có một câu hỏi về dữ liệu này: Mỗi mẫu sử dụng 16 bit, đó là 2 vị trí trong mảng audioBytes, rigth? Làm thế nào tôi có thể nhận được giá trị của mỗi mẫu? Định dạng được giải mã (wav) có các byte tiêu đề 44 không? Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn! – dedalo

0

Các dữ liệu mà bạn muốn là các mẫu thực tế, trong khi MP3 đại diện cho dữ liệu khác nhau. Vì vậy, giống như những gì mọi người khác đã nói - bạn cần một thư viện để giải mã dữ liệu MP3 thành các mẫu thực tế cho mục đích của bạn.

0

Như đã đề cập trong các câu trả lời khác, bạn cần một bộ giải mã để giải mã MP3 thành các mẫu âm thanh thông thường.

Một tùy chọn phổ biến sẽ là JavaLayer (LGPL).

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