मैं अपने एंड्रॉइड ऐप में एक लाइव 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
शायद यह क्योंकि Windows Media एनकोडर का उपयोग करता है एक " विंडोज मीडिया कोडेक "और एंड्रॉइड इसका समर्थन नहीं करता है। अब मैं एक समान समस्या से मिल रहा हूं, जहां मुझे वीडियो स्ट्रीम चलाने की ज़रूरत है, और स्ट्रीम विंडोज मीडिया एनकोडर से हैं। त्रुटि -1004 संभवतः असमर्थित कोडेक का अर्थ है - मुझे नहीं पता कि मैं इसका अर्थ कहां पा सकता हूं ... – mrmoment
ठीक है, बस उस MEDIA_ERROR_IO = -1004 को ढूंढें, जिसका अर्थ है "फ़ाइल या नेटवर्क से संबंधित ऑपरेशन त्रुटियां।" – mrmoment