2010-03-24 8 views
22

에 나는에 feed에 동적으로 생성 된 MP3 데이터를 내 응용 프로그램에서 경량 HTTP 서버를 작성하는 노력하고있어 내장 AndroidMediaPlayer. 내 콘텐츠를 SD card에 저장할 수 없습니다.스트리밍 안드로이드 MediaPlayer를

기본적으로 입력 데이터는 무한한 길이입니다. MediaPlayer에 데이터 소스는 기본적으로 "http://localhost/myfile.mp3"과 같아야한다고 말합니다. 이 요청을하기 위해 MediaPlayer을 기다리는 간단한 서버를 설정했습니다. 그러나 MediaPlayer은 그리 협조 적이 지 않습니다. 처음에는 HTTP GET이되며 전체 파일을 가져옵니다. 우리가 시도하고 단순히 데이터를 socket으로 덤프하면 시간이 초과되므로 범위 머리글 HTTP을 사용하여 데이터를 청크로 쓰려고했습니다. MediaPlayer은이 작업을 좋아하지 않으며 후속 청크를 계속 요청하지 않습니다.

아무도 성공한 데이터를 MediaPlayer에 직접 스트리밍 했습니까? 대신 RTSP 또는 Shoutcast 서버를 구현해야합니까? 단순히 HTTP header이라는 치명적 오류가 누락 되었습니까? 여기서 어떤 전략을 사용해야합니까?

+0

비디오 파일을 재생할 때도이 방법을 사용 했습니까? 오디오 파일과 동일한 기능을 수행 했습니까? –

+0

안녕하세요 Rob이 문제에 대한 해결 방법을 찾으셨습니까? 샘플 코드를 공유 할 수 있습니까? –

+0

나는 그것을 늦게 알고있다. 그러나 이것은 미래에 여기서 끝날 사람들을위한 것입니다. 이 [** 링크 **] (http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091)에는 코드가 있습니다. – Samuel

답변

3

HTTP 서버가 실제로 전화 자체에서 호스팅되었습니다. 그것은 매우 간단했다 : 단지 thread 소켓을 듣고 HTTP GET 요청. HTTP 요청을받은 경우 new socket, 헤더를 다시 쓰고 MP3 오디오 데이터 을 socket으로 다시 시작하십시오. 이 HTTP 서버는 다른 작업을 수행하지 않았습니다.

Android Media Player은 내가 으로 스트리밍하는 동안 음악을 재생하고있었습니다. Media Player은 오디오 재생 중에 buffer 의 재생을 비우면 제대로 작동하지 않습니다. 은 내 HTTP 서버가 계속 socket에 데이터를 쓰는 것을 확인하는 것이 매우 중요했습니다. I 작은 덩어리 (10 kB)로 소켓으로 이동 된 바이트. 내 HTTP 응답의 헤더는 다음과 같이보고 결국 : 나는 파이프가 왔으면 유지로

// 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"); 

을 한, Android Media Player는 불평없이 소비 을 유지했다. 오디오 만 재생하면 요청 및 응답이 필요합니다. 그것은 꽤 잘 작동하게되었습니다.

+1

전체 코드가 어디서나 호스팅 될 수 있습니까? MediaRecorder + 카메라에서 나오는 라이브 비디오로 동일한 작업을 수행하려고 시도하고 있으며 다른 시도와 라이브러리를 쫓아 내고 지쳐 있습니다. 그렇지 않다면 여기에 세부 사항을 추가하기 위해 어떤 현상금이 필요합니까? – ChiefTwoPencils