2012-11-20 16 views
6

मैं अपने एंड्रॉइड ऐप में एक लाइव HTTP स्ट्रीम खेलना चाहता हूं, इसलिए मैंने उसी मीडिया पर एक और पीसी पर विंडोज मीडिया एनकोडर 9 स्थापित किया, और इसे लाइव HTTP ऑडियो स्ट्रीम बनाने के लिए इस्तेमाल किया।मैं एंड्रॉइड पर मीडियाप्लेयर में लाइव HTTP ऑडियो स्ट्रीम कैसे चला सकता हूं?

लाइव HTTP स्ट्रीम ठीक है: मैंने इसका परीक्षण किया, और इसे एक पीसी पर विंडोज मीडिया प्लेयर या वीएलसी द्वारा खेला जा सकता है, और मेरे मोबाइल पर एंड्रॉइड के लिए वीएलसी द्वारा खेला जा सकता है।

तो, अपने Android एप्लिकेशन में, मैं इस कोड लिखा है:

private MediaPlayer player = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
      .detectDiskReads() 
      .detectDiskWrites() 
      .detectNetwork() // or .detectAll() for all detectable problems 
      .penaltyLog() 
      .build()); 
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
      .detectLeakedSqlLiteObjects() 
      //.detectLeakedClosableObjects() 
      .penaltyLog() 
      .penaltyDeath() 
      .build()); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btnPlay = (Button)findViewById(R.id.play); 
    address = (TextView)findViewById(R.id.address); 

    btnPlay.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      play(); 
     } 
    }); 

} 

private void play() 
{ 
    String serverIp; 

    serverIp = address.getText().toString(); // get the uri address, for example http://xxx.xxx.xxx.xxx:2340 

    if (player == null) 
    { 
     player = new MediaPlayer(); 
    } 
    else 
    { 
     player.stop(); 
     player.reset(); 
    } 
    try { 
     Log.v("", "Init a new MediaPlayer"); 

     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     Log.v("", "Set the stream type to STREAM_MUSIC"); 

     player.setDataSource(this, Uri.parse(serverIp)); 
     Log.v("", "Set the source is " + serverIp); 

     player.setOnBufferingUpdateListener(this); 
     player.setOnPreparedListener(this); 
     player.setOnErrorListener(this); 

     player.prepareAsync(); 
     Log.v("", "After prepareAsync"); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     Log.v("IllegalArgumentException", e.toString()); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     Log.v("SecurityException", e.toString()); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     Log.v("IllegalStateException", e.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Log.v("IOException", e.toString()); 
    } catch (Exception e) { 
     Log.v("Exception",e.toString()); 
    } 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 


@Override 
public void onPrepared(MediaPlayer mp) { 
    // TODO Auto-generated method stub 
    try { 
     Log.v("onPrepared", "After prepareAsync"); 
     mp.start(); 
    } 
    catch (Exception e) { 
     Log.v("play", e.toString()); 
    } 
} 

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 
    // TODO Auto-generated method stub 
    Log.v("onBufferingUpdate", "Buffering Update"); 
} 

@Override 
public boolean onError(MediaPlayer mp, int what, int extra) { 
    // TODO Auto-generated method stub 
    Log.v("MediaPlayer onError", "what=" + what + " extra=" + extra); 

    return true; 
} 

लेकिन यह काम नहीं किया। जब मैं play बटन पर क्लिक करता हूं, कुछ भी नहीं होता है। लेकिन अगर मैं इंटरनेट पर पाया गया कुछ अन्य यूआरएल इनपुट करता हूं (उदाहरण के लिए, http://www.example.com/song.mp3), यह काम करता है।

तो क्या कोई मेरी मदद कर सकता है? लॉग जानकारी नीचे है। मेरा मोबाइल एचटीसी एस 710e है, और मेरा एंड्रॉइड संस्करण 4.0.4 है।

11-20 22:28:14.137: V/(580): Init a new MediaPlayer 
11-20 22:28:14.137: V/(580): Set the stream type tp STREAM_MUSIC 
11-20 22:28:14.147: D/MediaPlayer(580): Couldn't open file on client side, trying server side 
11-20 22:28:14.178: E/Trace(39): error opening trace file: No such file or directory (2) 
11-20 22:28:14.178: V/(580): After prepareAsync 
11-20 22:28:14.297: V/ChromiumHTTPDataSource(39): connect on behalf of uid 10044 
11-20 22:28:14.339: I/qtaguid(39): Tagging socket 27 with tag 3f500000000(1013) for uid 10044 failed errno=-2 
11-20 22:28:14.629: I/ChromiumHTTPDataSourceSupport(39): Server responded with http status 400 
11-20 22:28:14.648: I/qtaguid(39): Untagging socket 27 failed errno=-2 
11-20 22:28:14.657: I/AwesomePlayer(39): mConnectingDataSource->connect() returned -1004 
11-20 22:28:14.657: E/MediaPlayer(580): error (1, -1004) 
11-20 22:28:14.667: E/MediaPlayer(580): Error (1,-1004) 
11-20 22:28:14.667: V/MediaPlayer onError(580): what=1 extra=-1004 
+0

शायद यह क्योंकि Windows Media एनकोडर का उपयोग करता है एक " विंडोज मीडिया कोडेक "और एंड्रॉइड इसका समर्थन नहीं करता है। अब मैं एक समान समस्या से मिल रहा हूं, जहां मुझे वीडियो स्ट्रीम चलाने की ज़रूरत है, और स्ट्रीम विंडोज मीडिया एनकोडर से हैं। त्रुटि -1004 संभवतः असमर्थित कोडेक का अर्थ है - मुझे नहीं पता कि मैं इसका अर्थ कहां पा सकता हूं ... – mrmoment

+0

ठीक है, बस उस MEDIA_ERROR_IO = -1004 को ढूंढें, जिसका अर्थ है "फ़ाइल या नेटवर्क से संबंधित ऑपरेशन त्रुटियां।" – mrmoment

उत्तर

1

आप एंड्रॉइड 3.0 और 3.0 + संस्करण पर एचएलएस खेल सकते हैं, पुराने संस्करण एचएलएस का समर्थन नहीं करते हैं। नीचे यह कोड 3.0 + संस्करण पर काम कर सकता है। वीडियो को सभी एंड्रॉइड संस्करण चलाने के लिए आपको आरटीएसपी स्ट्रीमिंग या http प्रोग्रासिव डाउनलोड का उपयोग करना होगा।

प्लेयर वर्ग

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.media.MediaPlayer.OnVideoSizeChangedListener; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 


public class VideoPlayerActivity extends Activity implements 
     OnBufferingUpdateListener, OnCompletionListener, 
     OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback { 

    private static final String TAG = "MediaPlayerDemo"; 
    private int mVideoWidth; 
    private int mVideoHeight; 
    private MediaPlayer mMediaPlayer; 
    private SurfaceView mPreview; 
    private SurfaceHolder holder; 
    private String path; 
    private Bundle extras; 
    private static final String MEDIA = "media"; 
    private static final int STREAM_VIDEO = 5; 
    private boolean mIsVideoSizeKnown = false; 
    private boolean mIsVideoReadyToBePlayed = false; 

    /** 
    * 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     mPreview = (SurfaceView) findViewById(R.id.VideoView); 
     holder = mPreview.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     extras = getIntent().getExtras(); 

    } 

    private void playVideo(Integer Media) { 
     doCleanUp(); 
     try { 

      path = "http://www.pocketjourney.com/downloads/pj/video/famous.3gp"; 


      // Create a new media player and set the listeners 
      mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setDataSource(path); 
      mMediaPlayer.setDisplay(holder); 
      mMediaPlayer.prepare(); 
      mMediaPlayer.setOnBufferingUpdateListener(this); 
      mMediaPlayer.setOnCompletionListener(this); 
      mMediaPlayer.setOnPreparedListener(this); 
      mMediaPlayer.setOnVideoSizeChangedListener(this); 
      //mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 


     } catch (Exception e) { 
      Log.e(TAG, "error: " + e.getMessage(), e); 
     } 
    } 

    public void onBufferingUpdate(MediaPlayer arg0, int percent) { 
     Log.d(TAG, "onBufferingUpdate percent:" + percent); 

    } 

    public void onCompletion(MediaPlayer arg0) { 
     Log.d(TAG, "onCompletion called"); 
    } 

    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { 
     Log.v(TAG, "onVideoSizeChanged called"); 
     if (width == 0 || height == 0) { 
      Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")"); 
      return; 
     } 
     mIsVideoSizeKnown = true; 
     mVideoWidth = width; 
     mVideoHeight = height; 
     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 
      startVideoPlayback(); 
     } 
    } 

    public void onPrepared(MediaPlayer mediaplayer) { 
     Log.d(TAG, "onPrepared called"); 
     mIsVideoReadyToBePlayed = true; 
     if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) { 
      startVideoPlayback(); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) { 
     Log.d(TAG, "surfaceChanged called"); 

    } 

    public void surfaceDestroyed(SurfaceHolder surfaceholder) { 
     Log.d(TAG, "surfaceDestroyed called"); 
    } 


    public void surfaceCreated(SurfaceHolder holder) { 
     Log.d(TAG, "surfaceCreated called"); 
     playVideo(STREAM_VIDEO); 


    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     releaseMediaPlayer(); 
     doCleanUp(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     releaseMediaPlayer(); 
     doCleanUp(); 
    } 

    private void releaseMediaPlayer() { 
     if (mMediaPlayer != null) { 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
    } 

    private void doCleanUp() { 
     mVideoWidth = 0; 
     mVideoHeight = 0; 
     mIsVideoReadyToBePlayed = false; 
     mIsVideoSizeKnown = false; 
    } 

    private void startVideoPlayback() { 
     Log.v(TAG, "startVideoPlayback"); 
     holder.setFixedSize(mVideoWidth, mVideoHeight); 
     mMediaPlayer.start(); 
    } 
} 

मुख्य एक्सएमएल

<VideoView 
     android:id="@+id/VideoView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:layout_weight="1"/> 

    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" android:layout_weight="1" android:background="#aaaaaa"> 
    </LinearLayout> 

</LinearLayout> 

और आप अपने प्रकट इंटरनेट अनुमति जोड़ने के लिए

uses-permission android:name="android.permission.INTERNET" /> 
+1

आपके उत्तर के लिए धन्यवाद , लेकिन मेरा संस्करण एंड्रॉइड 4.0.4 है। और मैं सिर्फ एक लाइव ऑडियो स्ट्रीम खेलना चाहता हूं, वीडियो की आवश्यकता नहीं है। और मैं एक 'http: // www.example.com/somemp3.mp3' खेल सकता हूं, लेकिन मैं लाइव स्ट्रीम (रेडियो स्ट्रीम के समान नहीं) खेल सकता हूं। – Shawn

+0

क्या आप अपना स्ट्रीमिंग लिंक मुझे अपने कस्टम प्लेयर पर परीक्षण करने दे सकते हैं? – Talha

+0

ठीक है, मैंने अपने पीसी (विंडोज एक्सपी) पर विंडोज मीडिया एनकोडर 9 स्थापित किया है, और विंडोज मीडिया एनकोडर में माइक को कैप्चर करने के लिए http लाइव ऑडियो स्ट्रीम बनाया है, लाइव स्ट्रीम का पता "http: // shawn-pc है : 2340 ", और शॉन-पीसी का स्थानीय आईपी पता 192.168.1.107 है, इसलिए स्ट्रीमिंग लिंक http://192.168.1.107:2340 होगा। मैं इस स्ट्रीम को वीएलसी प्लेयर द्वारा वीसीसी द्वारा या वीएलसी द्वारा अपने मोबाइल – Shawn