2014-04-15 3 views
2

MediaPlayer를 사용하여 Android 기기에서 SoundCloud 트랙을 스트리밍하려고하는데 제대로 작동하는 데 어려움이 있습니다. SoundCloud java API wrapper을 사용하여 SoundCloud에서 데이터를 가져 오면 정상적으로 작동합니다. MediaPlayer를 인스턴스는 다음과 같이 설정된다 :Android MediaPlayer에서 SoundCloud 트랙을 스트리밍하지 못했습니다.

mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

하고 버튼을 클릭 할 때, 스트림이 호출된다

public void onClick(View v) { 
    try { 
//  mMediaPlayer.setDataSource(mStreamURL); 
     mMediaPlayer.setDataSource(mPlayButton.getContext(), Uri.parse(mStreamURL)); 
     mMediaPlayer.prepare(); 
     mMediaPlayer.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

가변 mStreamURL는 사운드 클라우드 예컨대로부터 얻어지는 스트림의 URL이 포함을 https://api.soundcloud.com/tracks/143042205/stream. 나는 사운드 클라우드에서 그들 중 몇 얻을 수 있기 때문에 내가 (필자는 아래에서 분명히 불필요한 정보를 제거했다),이 경우에 사용되어야한다고하는 URL 아주 확실하지 않다 :

{"id":143042205, 
"title":"Piano Sonata No.26 In E Flat, Op.81a - Les Adieux - 3. Das Wiedersehn (Vivacissimamente)", 
"sharing":"public", 
"download_url":"https:\/\/api.soundcloud.com\/tracks\/143042205\/download", 
"streamable":true, 
"permalink_url":"http:\/\/soundcloud.com\/ystein-myrmo\/piano-sonata-no-26-in-e-flat-2", 
"original_format":"mp3", 
"original_content_size":12515204, 
"attachments_uri":"https:\/\/api.soundcloud.com\/tracks\/143042205\/attachments", 
"stream_url":"https:\/\/api.soundcloud.com\/tracks\/143042205\/stream", 
"uri":"https:\/\/api.soundcloud.com\/tracks\/143042205", 
"permalink":"piano-sonata-no-26-in-e-flat-2", 
"secret_uri":"https:\/\/api.soundcloud.com\/tracks\/143042205?secret_token=s-GvCYp", 
"waveform_url":"https:\/\/w1.sndcdn.com\/IASpgyYFSiPM_m.png"} 

내가 시도하여 모두 stream_urlpermalink_url이지만 모두 실패합니다. mMediaPlayer.setDataSource(mStreamURL);mMediaPlayer.setDataSource(mPlayButton.getContext(), Uri.parse(mStreamURL));을 사용하여 MediaPlayer에 대한 데이터 소스를 설정하는 데 차이가 있음에 유의하십시오. 전자를 사용하는 경우, 나는 MediaPlayer를 인스턴스에서 오류가 얻을,하지만 난 후자를 사용할 때 다음과 같은 오류 얻을 :

D/SoundCloudProfileWidget(388): Trying to play track http://soundcloud.com/ystein-myrmo/piano-sonata-no-26-in-e-flat-2 
I/MediaPlayer(388): path is null 
D/MediaPlayer(388): setDataSource IOException happend : 
D/MediaPlayer(388): java.io.FileNotFoundException: No content provider: http://soundcloud.com/ystein-myrmo/piano-sonata-no-26-in-e-flat-2 
D/MediaPlayer(388):  at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:761) 
D/MediaPlayer(388):  at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:665) 
D/MediaPlayer(388):  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:960) 
D/MediaPlayer(388):  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:914) 
D/MediaPlayer(388):  at com.test.app.soundcloud.SoundCloudProfileWidget$PlayButtonListener.onClick(SoundCloudProfileWidget.java:149) 
D/MediaPlayer(388):  at android.view.View.performClick(View.java:4475) 
D/MediaPlayer(388):  at android.view.View$PerformClick.run(View.java:18786) 
D/MediaPlayer(388):  at android.os.Handler.handleCallback(Handler.java:730) 
D/MediaPlayer(388):  at android.os.Handler.dispatchMessage(Handler.java:92) 
D/MediaPlayer(388):  at android.os.Looper.loop(Looper.java:176) 
D/MediaPlayer(388):  at android.app.ActivityThread.main(ActivityThread.java:5419) 
D/MediaPlayer(388):  at java.lang.reflect.Method.invokeNative(Native Method) 
D/MediaPlayer(388):  at java.lang.reflect.Method.invoke(Method.java:525) 
D/MediaPlayer(388):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
D/MediaPlayer(388):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
D/MediaPlayer(388):  at dalvik.system.NativeStart.main(Native Method) 
D/MediaPlayer(388): Couldn't open file on client side, trying server side 

prepare()에 도착했을 때 다음과 같은를 얻을 데이터 소스를 설정하는 두 가지의 경우를 MediaPlayer를위한 방법 : 난 아무데도 error (1, -1004)에 대한 정보를 찾을 수 있고, 내가 여기 손실의 비트에서 오전

V/MediaPlayer(4964): prepare 
V/MediaPlayer(4964): message received msg=100, ext1=1, ext2=-1004 
E/MediaPlayer(4964): error (1, -1004) 
V/MediaPlayer(4964): signal application thread 
V/MediaPlayer(4964): prepare complete - status=1 
W/System.err(4964): java.io.IOException: Prepare failed.: status=0x1 
W/System.err(4964):  at android.media.MediaPlayer.prepare(Native Method) 
W/System.err(4964):  at com.test.app.soundcloud.SoundCloudProfileWidget$PlayButtonListener.onClick(SoundCloudProfileWidget.java:143) 
W/System.err(4964):  at android.view.View.performClick(View.java:4475) 
W/System.err(4964):  at android.view.View$PerformClick.run(View.java:18786) 
W/System.err(4964):  at android.os.Handler.handleCallback(Handler.java:730) 
W/System.err(4964):  at android.os.Handler.dispatchMessage(Handler.java:92) 
W/System.err(4964):  at android.os.Looper.loop(Looper.java:176) 
W/System.err(4964):  at android.app.ActivityThread.main(ActivityThread.java:5419) 
W/System.err(4964):  at java.lang.reflect.Method.invokeNative(Native Method) 
W/System.err(4964):  at java.lang.reflect.Method.invoke(Method.java:525) 
W/System.err(4964):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
W/System.err(4964):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
W/System.err(4964):  at dalvik.system.NativeStart.main(Native Method) 

. 인터넷 검색도 매우 도움이되는 것 같습니다. 또한 다음을 시도했습니다.

  1. mMediaPlayer.prepareAsync()으로 변경합니다. 이것에
  2. 권한 변경 : 스트림 URL에 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. http로 변경 https 반대의 경우도 마찬가지.
  4. 기타 여러 가지.

모든 댓글 또는 힌트를 보내 주시면 감사하겠습니다.

답변

3

스트림 URL 뒤에 ?client_id=YOUR_API_KEY을 추가해야합니다.

예 : stream_url = https://api.soundcloud.com/tracks/143042205/stream?client_id=YOUR_API_KEY

+2

감사합니다. 'permalink_url'이 아니라'stream_url'을 사용해야합니다. 그래서 mMediaPlayer.setDataSource (mPlayButton.getContext(), Uri.parse ("https://api.soundcloud.com/tracks/143042205/stream?client_id=MY_CLIENT_ID"))와'mMediaPlayer.setDataSource ("https : //api.soundcloud.com/tracks/143042205/stream? client_id = MY_CLIENT_ID "); '트릭을 수행하십시오. 또한'https'를'http'로 변경하는 것이 가능하며 여전히 작동하는 것으로 보입니다. 이것은 [HTTPS가 Android 3.1 이전에는 지원되지 않기 때문에] 좋을 수 있습니다. (http://developer.android.com/guide/appendix/media-formats.html). –

+0

죄송합니다. 답변을 업데이트했습니다. – cucko

+1

@ Krøllebølle, https에서 http 로의 전환에 대해 언급 해 주셔서 감사합니다. "오류 (1, -2147483648)"가 표시되어 문제를 파악할 수 없었습니다. 밖으로, 나는 안드로이드의 이전 버전을 사용하고 변환이 필요합니다. 다시 한 번 감사드립니다. – sadaf

관련 문제