2009-10-30 55 views
19

Như tôi đã hiểu, Android sẽ chỉ phát âm thanh định dạng AAC nếu được mã hóa dưới dạng MPEG-4 hoặc 3GPP.Truyền trực tuyến âm thanh AAC với Android

Tôi có thể phát âm thanh AAC được mã hóa dưới dạng M4A khi nó là cục bộ cho ứng dụng nhưng không thành công khi nhận được từ máy chủ.

Các công trình sau đây, vì tệp m4a được lưu trữ cục bộ trong thư mục res/raw.

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*); 
mp.start(); 

Các tính năng sau không hoạt động. (Nhưng với MP3).

Uri uri = Uri.parse("http://*example.com*/blah.m4a"); 
MediaPlayer mp = MediaPlayer.create(this, uri); 
mp.start(); 

Bất kỳ ai có thể phát hiện bất kỳ ánh sáng nào về lý do không thành công khi tệp âm thanh m4a không phải là địa phương?

Dưới đây là (một số) lỗi ...

ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus 
ERROR/MediaPlayer(769): error (200, -32) 
WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete 
DEBUG/MediaPlayer(769): create failed: 
DEBUG/MediaPlayer(769): java.io.IOException: Prepare failed.: status=0xC8 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.prepare(Native Method) 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.create(MediaPlayer.java:530) 
DEBUG/MediaPlayer(769):  at android.media.MediaPlayer.create(MediaPlayer.java:507) 
... 

Tôi đang nhắm mục tiêu SDK 1.6.

+0

Bạn đang bối rối với các định dạng tệp. AAC là định dạng mã hóa âm thanh. M4A là loại tệp hoặc gói, nằm xung quanh dữ liệu AAC. 3GPP tương tự nhưng có thể chứa các loại âm thanh được mã hóa khác. Xem tại đây http://developer.android.com/guide/appendix/media-formats.html và tại đây http://en.wikipedia.org/wiki/M4a. – greg7gkb

+0

Đúng, tôi nên mô tả 3GPP và M4A là "vùng chứa" cho âm thanh AAC. Trên đỉnh đầu của tôi, tôi nghĩ * M4A chỉ có thể được sử dụng cho các tệp tĩnh và 3GPP chỉ có thể truyền bằng RTSP thay vì HTTP? Điều này sẽ gây ra sự cố cho phát trực tuyến HTTP. Đúng nếu tôi sai ... – bdls

Trả lời

0

Đây là cảnh hoang dã trong bóng tối, nhưng tôi đã thấy hành vi tương tự với trình phát flash nơi nó thực sự bỏ qua tên tệp và chỉ dựa vào loại MIME được máy chủ gửi. Bất kỳ ý tưởng nào tiêu đề đang được gửi xuống từ example.com? Bạn có thể muốn thử gói blah.m4a của bạn trong một trang có thể đặt tiêu đề và sau đó truyền dữ liệu nhị phân. Cung cấp cho các loại một shot và cộng đồng sẽ đánh giá cao một sự xác nhận những gì hoạt động:

audio/mpeg audio/mp4a audio/mp4a-latm audio/aac audio/x-aac

+0

Một đề xuất tốt - cảm ơn. Thật không may tôi đã không có may mắn cố gắng một mảng các loại nội dung có thể. Để tham khảo, tôi đã liệt kê những cái chưa hoạt động bên dưới. Nó vẫn có thể nó là một cái gì đó để làm với tiêu đề HTTP - hoặc một cái gì đó - nó có thể là nó rất kén chọn về những gì nó có thể được cho ăn. 'âm thanh/m4a âm thanh/âm thanh aacp/âm thanh aacp/x-aac âm thanh/mpeg âm thanh/mp4a âm thanh/mp4a-latm âm thanh/mp4' – bdls

+1

Tôi chắc chắn đã gặp phải sự cố với điều này. Đối với mục đích phát trực tuyến của chúng tôi, MediaPlayer sẽ không phát tệp trực tuyến trừ khi loại nội dung tiêu đề của Http được đặt chính xác. Thật thú vị, độ dài nội dung là không cần thiết mặc dù. – greg7gkb

5

này công việc -around cho phép bạn phát tệp M4A từ mạng (và tệp AAC trong các vùng chứa khác như MP4 & 3GP). Nó chỉ đơn giản là tải các tập tin và chơi từ bộ nhớ cache.

private File mediaFile; 

private void playAudio(String mediaUrl) { 
    try { 
     URLConnection cn = new URL(mediaUrl).openConnection(); 
     InputStream is = cn.getInputStream(); 

     // create file to store audio 
     mediaFile = new File(this.getCacheDir(),"mediafile"); 
     FileOutputStream fos = new FileOutputStream(mediaFile); 
     byte buf[] = new byte[16 * 1024]; 
     Log.i("FileOutputStream", "Download"); 

     // write to file until complete 
     do { 
      int numread = is.read(buf); 
      if (numread <= 0) 
       break; 
      fos.write(buf, 0, numread); 
     } while (true); 
     fos.flush(); 
     fos.close(); 
     Log.i("FileOutputStream", "Saved"); 
     MediaPlayer mp = new MediaPlayer(); 

     // create listener to tidy up after playback complete 
     MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() { 
      public void onCompletion(MediaPlayer mp) { 
       // free up media player 
       mp.release(); 
       Log.i("MediaPlayer.OnCompletionListener", "MediaPlayer Released"); 
      } 
     }; 
     mp.setOnCompletionListener(listener); 

     FileInputStream fis = new FileInputStream(mediaFile); 
     // set mediaplayer data source to file descriptor of input stream 
     mp.setDataSource(fis.getFD()); 
     mp.prepare(); 
     Log.i("MediaPlayer", "Start Player"); 
     mp.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+5

Ý tưởng hay nhưng tất nhiên điều này đòi hỏi toàn bộ tập tin cần tải xuống trước khi nó có thể được phát. Có thể hữu ích cho một số tình huống nhưng rõ ràng không phù hợp như một giải pháp truyền trực tuyến. – greg7gkb

+0

Đó là sự thật, mặc dù mã này có thể được xây dựng trên để tạo ra một giải pháp streaming bằng cách sử dụng một tập tin địa phương hoặc các tập tin như một bộ đệm tròn tạm thời. Thật không may là MediaPlayer không thể nhận được từ một InputStream hoặc bạn có thể làm một bộ đệm tròn theo cách tiêu chuẩn. – bdls

-2

thử -

1) MP.prepareAsync()

2) onPrepared() { mp.start() }

0

tôi đã viết một blog smal về một giải pháp dựa trên đám mây tôi sử dụng cho một máy nghe nhạc tôi đang phát triển. Nó dựa trên dự án Android Cloud Services (ACS) trẻ, chưa có sẵn, nhưng nó vẫn cho thấy một giải pháp tiềm năng sử dụng chuyển mã dựa trên đám mây để truyền bất kỳ tệp phương tiện nào. Có một cái nhìn: http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-android-cloud.html

Joel

+0

Xin chào Joel. Đó là một lựa chọn có thể, tuy nhiên nó loại bỏ những ưu điểm của AAC so với các định dạng khác (chất lượng cảm nhận cao hơn ở tốc độ bit thấp hơn) khi bạn chỉ phát trực tuyến MP3 ở cuối. – bdls

2

Có một Freeware Advanced Audio (AAC) Decoder for Android. Bạn có thể sử dụng điều này để được trợ giúp và Hướng dẫn hoặc sử dụng lớp Multiplayer trong đó để phát lại âm thanh. Có một ứng dụng mẫu và thư viện ở trong đó để giúp bạn hiểu

Hope this helps

+0

Nó được viết "XIN LƯU Ý rằng việc sử dụng phần mềm này có thể yêu cầu thanh toán tiền bản quyền bằng sáng chế. Bạn cần phải xem xét vấn đề này trước khi bạn bắt đầu xây dựng các tác phẩm phái sinh. Chúng tôi không bảo đảm hoặc bồi thường cho bạn bằng bất kỳ cách nào cho quyền sở hữu bằng sáng chế! CHỊU TRÁCH NHIỆM RIÊNG CHO CÁC HÀNH ĐỘNG CỦA BẠN! Để biết thêm thông tin về các bằng sáng chế AAC, vui lòng truy cập http://www.vialicensing.com/licensing/aac-fees.aspx " => không chắc chắn rằng đó là ý tưởng hay sử dụng thư viện này! –

3

Có một sự open source OpenMXPlayer minh họa làm thế nào để xử lý âm thanh cho cả hai tập tin địa phương hoặc trực tuyến/trực tuyến nguồn. Nó hỗ trợ không chỉ AAC, mà còn các định dạng phổ biến khác.

Ý tưởng đằng sau nó, là sử dụng API MEdiaCodec, được giới thiệu trong Android 4.1.

Hy vọng điều này mang đến một điểm khởi đầu tốt cho bất kỳ ai cần triển khai trình phát âm thanh miễn phí nhanh chóng và phức tạp.

1

Tôi cũng đã thử nhưng tôi không thể tìm ra giải pháp!

Tại Google I/O cuối cùng, tôi thấy điều gì đó đã giúp tôi rất nhiều. Nó được mở rộng từ MediaPlayer và cải thiện rất nhiều thứ! Hãy xem.

ExoPlayer CÓ THỂ GIÚP BẠN RẤT NHIỀU

Kiểm tra này là một phần của ví dụ:

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024; 
private static final int BUFFER_SEGMENT_COUNT = 256; 
... 

// String with the url of the radio you want to play 
String url = getRadioUrl(); 
Uri radioUri = Uri.parse(url); 
// Settings for exoPlayer 
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE); 
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo"); 
DataSource dataSource = new DefaultUriDataSource(context, null, userAgent); 
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT); 
audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource); 
// Prepare ExoPlayer 
exoPlayer.prepare(audioRenderer); 

EXOPLAYER- tôi có thể chơi bất cứ điều gì từ streamings (video và audio)!

CHO TÔI BIẾT NẾU BẠN CẦN GIÚP ĐỂ THỰC HIỆN CNTT! :)

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