2010-11-17 8 views
13

Cấp SDK 8 (Froyo) đã giới thiệu khả năng gốc cho MediaPlayer để kết nối với nguồn phát trực tuyến, như Shoutcast. Các phiên bản SDK trước đó có thể thực hiện các giải pháp thay thế, chẳng hạn như chạy proxy cục bộ trên thiết bị (xem NPR).Phát trực tiếp bằng Android MediaPlayer trong SDK 8

Tôi đã sử dụng phương pháp tương tự như NPR và đang sử dụng StreamProxy. Tuy nhiên, trước tiên NPR sẽ kiểm tra xem SDK hiện đang chạy có dưới 8 hay không. Nếu có, nó sử dụng proxy. Nếu không, nó kết nối trực tiếp.

My StreamProxy yêu cầu siêu dữ liệu từ máy chủ Shoutcast, do đó, nó không đơn giản định tuyến dữ liệu từ Shoutcast cho khách hàng của tôi. Thay vào đó, nó phân tích siêu dữ liệu và sử dụng nó cho phù hợp, và chỉ định tuyến dữ liệu âm nhạc.

Khi cố gắng sử dụng StreamProxy ở cấp SDK 8 trở lên, MediaPlayer không thể chuẩn bị. StreamProxy của tôi nhận kết nối và chấp nhận nó, nhưng sau khi viết thành công dòng trạng thái và các tiêu đề cho máy khách, ghi tiếp theo sẽ tạo ra java.net.SocketException: Connection reset by peer. Điều này dẫn đến mediaplayer của khách hàng ném một Error(1,-1007).

Tôi đang cố gắng tìm ra lý do tại sao MediaPlayer không thể kết nối với proxy cục bộ của tôi. Nó phải giống như kết nối với nguồn ban đầu không có siêu dữ liệu, trong đó có hoạt động. Tôi đang chuyển tiếp trên tất cả các tiêu đề từ nguồn bên ngoài, thông qua proxy của tôi, bao gồm loại nội dung.

Tôi sẽ tiếp tục xem xét, nhưng tôi cảm thấy như tôi đang ở điểm chết. Hãy cho tôi biết nếu cần thêm chi tiết.

+0

Cách phát SHOUTcast? Http: //stackoverflow.com/a/8833346/265167 –

Trả lời

12

EDIT: Ok Tôi bây giờ tin rằng tôi có câu trả lời!

Stagefright là nghiêm ngặt khi nói đến line-endings trong tiêu đề HTTP; Họ phải là CR, LF và không chỉ LF mà đã làm việc trước đó.

Vì vậy, nếu bạn xây dựng tiêu đề của riêng mình, thay thế bất kỳ "\ n" với "\ r \ n" và bạn cần sử dụng tốt.

(Nếu bạn muốn kiểm tra này cho chính mình, nhìn vào receive_line() trong media/libstagefright/HTTPStream.cpp)

bây giờ tôi có thể truyền Shoutcast với Metadata trên 2.2/điện thoại Stagefright .. .

...

Tôi đã gặp sự cố tương tự;

Trước tiên, tôi đã thử viết dữ liệu được truyền tới một tệp có độ dài cố định và gói - và phát bằng setLooping (đúng). Điều này gây ra ổn định khi các vòng MP3, mặc dù tôi trích xuất toàn bộ khung MP3 và cố gắng để đệm byte không đồng đều ở cuối với cả 0xff và 0x00. Điều này có thể vẫn là một giải pháp có thể chấp nhận được nếu bạn có một tệp đủ lớn.

Sau đó, tôi đã thực hiện điều proxy hoạt động trên Samsung Galaxy S (v2.2) nhưng không phải trong giả lập và dường như không phải trên Desire (Không làm việc = Lỗi -1007 như đã đề cập ở trên). Một gợi ý có thể là Galaxy S Mediaplayer yêu cầu HTTP1.0, trong khi nó là 1,1 trong trình mô phỏng.

Phương pháp brute-force sẽ được mở 2 dòng song song, đọc meta-data từ một và streaming từ khác;)

Dù sao, tôi cũng muốn nghe nếu bất cứ ai khác đã có may mắn hơn. ..

+0

The -1007 xảy ra với Stagefright và không phải Opencore. Có vẻ như Galaxy S v2.2 vẫn sử dụng OpenCore. – Sasq

1

MediaPlayer phát trực tuyến khả dụng kể từ cấp API 1. Tôi đã làm trình phát video RTSP demo khoảng một năm rưỡi trước. Nagare ứng dụng khách shoutcast hiện đã được hai tuổi.

Tôi có thiếu gì đó ở đây không?

+0

Kết nối trực tiếp với nguồn Shoutcast chưa bao giờ hoạt động trước 2.2. SDK 8 đã giới thiệu StageFright (http://developer.android.com/sdk/android-2.2-highlights.html#PlatformTechnologies), một khung trình phát phương tiện mới. Tôi sẽ kiểm tra cách họ đã thực hiện nó ở Nagare, và tôi sẽ quan tâm để xem nếu nó làm điều tương tự cho trước 2.2 và sau 2.2. – Dharwin

+0

Thx để giải thích. –

+0

Không sao cả! Tôi không hoàn toàn hiểu được khả năng thay đổi của bản thân mình. Tuy nhiên, nó đã làm cho tôi tự hỏi nếu tôi bằng cách nào đó có thể thiết lập mediaplayer của tôi để sử dụng khung cũ. Nhìn vào đó ngay bây giờ. – Dharwin