2010-03-24 40 views
22

Tôi đang cố gắng viết máy chủ HTTP trọng lượng nhẹ trong ứng dụng của mình thành feed được tạo động MP3 dữ liệu được tích hợp sẵn trong AndroidMediaPlayer. Tôi không được phép lưu trữ nội dung của mình trên SD card.Truyền tới Android MediaPlayer

Dữ liệu đầu vào của tôi về cơ bản có chiều dài vô hạn. Tôi nói với MediaPlayer rằng nguồn dữ liệu của nó về cơ bản phải là một cái gì đó như "http://localhost/myfile.mp3". Tôi đã thiết lập máy chủ đơn giản chờ số MediaPlayer để thực hiện yêu cầu này. Tuy nhiên, MediaPlayer không phải là rất hợp tác. Lúc đầu, nó làm cho một HTTP GET và cố gắng lấy toàn bộ tập tin. Nó hết thời gian nếu chúng ta thử và đơn giản đổ dữ liệu vào socket vì vậy chúng tôi đã thử sử dụng tiêu đề Phạm vi HTTP để ghi dữ liệu theo khối. MediaPlayer không thích điều này và không tiếp tục yêu cầu các đoạn tiếp theo.

Có ai có dữ liệu phát trực tiếp thành công trực tiếp vào MediaPlayer không? Tôi có cần phải triển khai máy chủ RTSP hoặc Shoutcast thay thế không? Tôi chỉ đơn giản là thiếu một số quan trọng HTTP header? Tôi nên sử dụng chiến lược nào ở đây?

+0

Bạn cũng có sử dụng phương pháp này để phát lại các tệp video không? Nó có thực hiện giống như tệp âm thanh không? –

+0

Xin chào, Rob có giải pháp nào cho vấn đề này không? bạn có thể chia sẻ mã mẫu không? –

+0

tôi biết muộn. nhưng điều này là dành cho những người kết thúc ở đây trong tương lai. [** Link **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091) có mã để bắt đầu. – Samuel

Trả lời

3

Máy chủ HTTP thực sự được lưu trữ trên chính điện thoại. Rất đơn giản: đơn giản: chỉ cần thread nghe trên ổ cắm cho yêu cầu HTTP GET . Khi nhận được yêu cầu HTTP, nó sẽ là một yêu cầu new socket, ghi lại một số tiêu đề HTTP và bắt đầu bán các dữ liệu âm thanh MP3 quay lại socket. Máy chủ HTTP này không làm gì khác.

Android Media Player đang phát nhạc khi tôi phát trực tiếp tới . Các Media Player cư xử rất kém nếu phát lại của nó buffer đã được làm trống trong khi nó đang phát âm thanh. Điều này rất quan trọng đối với tôi để đảm bảo máy chủ HTTP của tôi tiếp tục ghi dữ liệu vào số socket đó. Tôi chuyển byte vào ổ cắm theo khối nhỏ (10 kB). Các tiêu đề ứng phó HTTP của tôi đã kết thúc như thế này:

// Build response headers 
StringBuilder sb = new StringBuilder(); 
sb.append("HTTP/1.1 200 OK\r\n"); 
sb.append("Content-Type: audio/mpeg\r\n"); 
sb.append("Connection: close\r\n"); 
sb.append("Accept-Ranges: bytes\r\n"); 
sb.append("Content-Length: " + totalFileSize + "\r\n"); 
sb.append("Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

Chừng nào tôi còn giữ ống bùng lên, các Android Media Player giữ tiêu thụ nó mà không có khiếu nại. Chỉ phát âm thanh yêu cầu yêu cầu và phản hồi. Nó kết thúc hoạt động khá tốt.

+1

Bất kỳ cơ hội nào có mã đầy đủ được lưu trữ ở bất kỳ đâu? Tôi đang cố gắng làm tương tự với video trực tiếp đến từ Camera + MediaRecorder và đang hết sức với việc theo đuổi các nỗ lực và thư viện khác nhau. Nếu không, tiền thưởng kích thước sẽ mất bao nhiêu để thêm chi tiết ở đây? – ChiefTwoPencils

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