2012-05-06 37 views
5

Sau vô số giờ tìm kiếm và đọc qua nhiều mã nguồn, tôi đang ở điểm chết và tôi cần sự giúp đỡ của bạn. Như tiêu đề cho thấy tôi đang cố gắng để xây dựng (chưa một) máy nghe nhạc trong Java. Tôi stumbled khi Javazoom project và nó kinda hoạt động, nhưng nó cũng kinda không. Mục tiêu của tôi là có thể phát các tệp mp3 và ogg. Chơi nhạc mp3 hoạt động mà không có vấn đề gì: Tôi có thể nhận tất cả thông tin (thẻ ID3 và thông tin tệp âm thanh chung) và tôi có thể thực hiện tất cả các thao tác cần thiết (phát, tạm dừng, tiếp tục, tìm kiếm, v.v.). Nhưng khi tôi cố gắng chơi các tập tin ogg tôi chỉ có thể nhận được một trong hai, hoặc là tôi có thể phát tệp nhưng không nhận được thông tin tệp hoặc tôi nhận được tất cả thông tin nhưng không thể phát tệp. Mã của tôi về cơ bản là phiên bản cải tiến của lớp BasicPlayer, tôi đã thử xem qua trình phát jlGui để xem cách nó quản lý tương thích với mọi định dạng nhưng tôi hoàn toàn bị mất trong mã đó.Java đang phát mp3 và ogg

My MediaPlayer code

Đây là lệnh tôi sử dụng để biên dịch chương trình:

javac -cp lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;lib\tritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer.java 

Khi tôi thực hiện nó với

java -cp .;lib\jl1.0.1.jar;lib\jogg-0.0.7.jar;lib\jorbis-0.0.15.jar;liblog4j-1.2.16.jar;lib\mp3spi1.9.5.jar;libtritonus_jorbis-0.3.6.jar;libtritonus_share-0.3.6.jar;libvorbisspi1.0.3.jar MediaPlayer d:/foo.mp3 

nó sẽ hiển thị các thông tin và chơi các tập tin tốt, nhưng khi tôi cố gắng tương tự cho d: /foo.ogg Tôi nhận được ngoại lệ:

167 [main] DEBUG MediaPlayer - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 
Exception in thread "main" java.lang.RuntimeException: Error initializing stream: java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second, 
    at MediaPlayer.initAudioStream(MediaPlayer.java:302) 
    at MediaPlayer.open(MediaPlayer.java:663) 
    at MediaPlayer.main(MediaPlayer.java:772) 

Nhưng khi tôi sau đó nhận xét dòng 262 (gọi createLine() trong initAudioStream()) và chạy nó với lệnh cùng nó sẽ hiển thị tất cả các thông tin tập tin nhưng ném một ngoại lệ tương tự

170 [main] DEBUG MediaPlayer - Target format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian 
Exception in thread "main" java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian from VORBISENC 48000.0 Hz, unknown bits per sample, stereo, 1 bytes/frame, 16000.0 frames/second, 
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) 
    at MediaPlayer.createLine(MediaPlayer.java:362) 
    at MediaPlayer.initLine(MediaPlayer.java:392) 
    at MediaPlayer.startPlayback(MediaPlayer.java:483) 
    at MediaPlayer.play(MediaPlayer.java:672) 
    at MediaPlayer.main(MediaPlayer.java:773) 

VÀ khi tôi sau đó thêm lib \ tritonus_jorbis-0.3.6.jar vào classpath nó phát tệp ogg nhưng không hiển thị thông tin.

Vì vậy, vâng ... Tôi khá bối rối và thực sự có thể sử dụng một số trợ giúp.

Trả lời

0

Sự cố của bạn bắt nguồn từ giả định rằng việc triển khai trình phát cũng sẽ cung cấp siêu dữ liệu cho luồng. Thật không may, nhiều triển khai mà không bao giờ được thực hiện với goeal của việc cung cấp siêu dữ liệu.

Tôi sẽ tách riêng việc truy xuất siêu dữ liệu, sau đó bạn có thể sử dụng các thư viện khác nhau để truy cập siêu dữ liệu. Sau đó, bạn có thể sử dụng một số library specialized in metadata manipluation để giải quyết vấn đề này một cách độc lập khi phát tệp.

0

Thật không may, việc thực hiện javax.sound.sampled của jogg có một vài thiếu sót. Có lẽ bạn muốn cung cấp cho FFsampledSP một ảnh. Đó là một thực thi dựa trên FFmpeg cho Win và OSX, nó cũng thực hiện các giao diện javax.sound.sampled.

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