2014-04-15 37 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包含從SoundCloud,例如所獲得的流URL https://api.soundcloud.com/tracks/143042205/stream。我不太確定哪些URL應該在這種情況下使用,因爲我得到幾個人從SoundCloud(我從下面取出顯然不必要的信息):

{"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的方法:

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) 

我找不到任何error (1, -1004)隨時隨地的信息,我在這裏有點不知所措的。 Google搜索似乎也沒有什麼幫助。此外,我試過以下內容:

  1. 更改爲使用mMediaPlayer.prepareAsync()
  2. 權限更改爲這樣: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. 變化httpshttp,反之亦然在流URL。
  4. 其他各種東西。

任何意見或提示,非常感謝!

回答

3

您需要在Stream Url後添加?client_id=YOUR_API_KEY

在你的例子中:stream_url = https://api.soundcloud.com/tracks/143042205/stream?client_id=YOUR_API_KEY

+2

謝謝 - 這工作正常。請注意,應該使用'stream_url'而不是'permalink_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',它似乎仍然有效。這可以很好,因爲[Android 3.1之前不支持HTTPS](http://developer.android.com/guide/appendix/media-formats.html)。 –

+0

對不起,我更新了我的答案。 – cucko

+1

@Krøllebølle,感謝您提及https轉換爲http。我得到「錯誤(1,-2147483648)」,我無法弄清楚這個問題。事實證明,我使用的是舊版Android,需要轉換。 再次感謝, – sadaf

相關問題