2010-01-09 36 views
7

Tôi đang gặp sự cố khi nhận được MediaPlayer để có thể linh hoạt khi phát trực tiếp từ URL HTTP.Phát trực tuyến với lỗi MediaPlayer và lỗi bắt buộc của Android MediaPlayer

Nếu tôi bắt đầu phát tệp, nhưng sau đó thả kết nối (ví dụ: chế độ trên máy bay), MediaPlayer#OnErrorListener sẽ tạo ra what=1, extra=-17 và sau đó ngay sau đó what=-38, extra=0.

Không có tài liệu nào tôi có thể thấy trong các API về điều này biểu thị, ngoại trừ thêm là "Thường phụ thuộc vào triển khai". Tôi đang sử dụng HTC Hero (tốt, đó là G2 Touch của T-Mobile UK).

Những người khác có được cùng giá trị và có an toàn để nắm bắt các giá trị này có nghĩa là kết nối đã biến mất?

Làm cách nào để tôi có thể tiếp tục tốt nhất khi kết nối xuất hiện lại? (lưu tìm kiếm sở thích hiện tại và thử lại sau mỗi 5 giây?)

Làm cách nào để biết khi thiết bị đã quyết định bắt đầu phát những gì nó đang lưu vào bộ đệm - có gọi lại không (gọi là số isPlaying())?

Ngoài ra, tôi không hoàn toàn chắc chắn những gì onBufferingUpdate cung cấp. Tôi đang sử dụng podcast 40 phút MP3 (64kbps bitrate) - bộ đệm tăng 1%, 2%, 3%. Khi tôi tìm kiếm khoảng 30 phút, nó cho thấy 75%, sau đó khi tôi tìm kiếm trở lại bắt đầu trở lại 5% - điểm của cuộc gọi này là gì khác hơn là hiển thị khoảng những gì được lưu trữ?

Cuối cùng - có cách nào để hút những gì được truyền tới một số MP3 không?

+0

_ "Làm thế nào tôi có thể tiếp tục lại tốt nhất khi kết nối lại xuất hiện? (Lưu tìm kiếm tùy chọn hiện tại và thử lại sau 5 giây?) _ Tôi tò mò muốn tìm hiểu về giải pháp cuối cùng của bạn cho câu hỏi cụ thể này, vui lòng :) – Behnam

+0

Xin chào, tôi có cùng một vấn đề, cần phải tiếp tục phát trực tuyến khi kết nối xuất hiện lại. Hãy giúp tôi Tôi đang đấu tranh với quá nhiều ngày này – Sakthi

Trả lời

5

Taken từ This similar stack Overflow Question

Tôi quá thất vọng về MEDIA_INFO_BUFFERING_START và MEDIA_INFO_BUFFERING_END móc ... con số thấp.

Tôi đã xem ứng dụng Pandora và nó không hiển thị chỉ báo đệm. Khi nhạc bị gián đoạn cho việc lưu vào bộ đệm , nó chỉ nằm ở đó như thể không có gì xảy ra và giao diện người dùng trông giống như nó vẫn đang phát. Vì vậy, tôi đã đến kết luận rằng nếu bạn đang sử dụng MediaPlayer, bạn không thể xác định xem bản nhạc tạm thời có bị tạm dừng để lưu vào bộ đệm hay không.

Tuy nhiên, tôi đã thông báo rằng có một hằng số vài MediaPlayer rằng có thể được sử dụng: MEDIA_INFO_BUFFERING_START và MEDIA_INFO_BUFFERING_END. Nhưng chúng là chỉ khả dụng ở cấp API 9+ và tài liệu không nói bất cứ điều gì về số chúng. Tôi giả định rằng họ có thể được sử dụng với một OnInfoListener.

Tôi thất vọng, nhưng ít nhất tôi có thể ngừng quay bánh xe của tôi ngay bây giờ và di chuyển vào thứ khác.

+0

MediaPlayer của Android rất đáng thất vọng. Thiếu phương thức getState(), thiếu thông tin đệm , v.v. – StackOverflowed

2

Có thể thực hiện điều này

MediaPlayer có phương pháp để đăng ký một OnPreparedListener và OnBufferingUpdateListener

onPrepared sẽ được gọi khi người chơi đã đệm đủ để bắt đầu chơi.

http://developer.android.com/reference/android/media/MediaPlayer.OnPreparedListener.html

onBufferingUpdate sẽ được gọi để cập nhật cho bạn đệm thông tin.

http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html

Bạn cũng nên sử dụng dịch vụ kết nối để lắng nghe kết nối mạng

public boolean hasConnectivity() 
{ 
    ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = connectivityManager.getActiveNetworkInfo(); 

    int netType = info.getType(); 
    int netSubtype = info.getSubtype(); 

    if (netType == ConnectivityManager.TYPE_WIFI) 
    { 
     return info.isConnected(); 
    } 
    else if (netType == ConnectivityManager.TYPE_MOBILE && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS) 
    { 
     return info.isConnected(); 
    } 

    return false; 
} 
0

Khi bạn tìm kiếm hoặc bỏ qua hoặc kết nối bị mất và MediaPlayer giữ kết nối lại với máy chủ proxy, bạn phải gửi phản hồi này với Trạng thái 206 sau khi bạn nhận được yêu cầu và phạm vi (int) từ máy khách.

String headers += "HTTP/1.1 206 Partial Content\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + (fileSize-range) + "\r\n"; 
headers += "Content-Range: bytes "+range + "-" + fileSize + "/*\r\n"; 
headers += "\r\n"; 

Và khi bạn nhận được yêu cầu từ MediaPlayer không chứa Phạm vi trong tiêu đề HTTP, sau đó nó đang yêu cầu một tập tin dòng mới, trong trường hợp này đáp ứng tiêu đề của bạn sẽ giống như thế này:

String headers = "HTTP/1.1 200 OK\r\n"; 
headers += "Content-Type: audio/mpeg\r\n"; 
headers += "Accept-Ranges: bytes\r\n"; 
headers += "Content-Length: " + fileSize + "\r\n"; 
headers += "\r\n"; 

Tận hưởng!

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