2012-01-31 67 views
1

我试图流一些视频:与3gp一切正常,顺利,但当我尝试mp4(我用了几个视频测试,包括这一个,这应该肯定是好的和有效的 - commonsware.com/misc/test.mp4),我得到了一个例外。MediaPlayer.prepare()失败,并有一个有效的http链接

我有一个Android 2.2平板电脑进行测试,是我的问题,因为这个?请问mp4-via-http在android 2.3或更新版本上工作吗?或者是否有任何特定于我不知道的mp4准备步骤?现在我只做到以下几点:

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    gMp=new MediaPlayer(); 
    gMp.setDisplay(hndlr); 
    try { 
     gMp.setDataSource(this, Uri.parse("http://commonsware.com/misc/test.mp4")); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     gMp.prepareAsync(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    gMp.start(); 
} 

这里是我的错误日志:

I/ActivityManager( 107): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.video.mp/.VideoSharingViaMPActivity }  
I/ActivityManager( 107): Start proc com.video.mp for activity com.video.mp/.VideoSharingViaMPActivity: pid=746 uid=10055 gids={1015, 3003}  
D/dalvikvm( 746): GC_FOR_MALLOC freed 576 objects/46928 bytes in 37ms  
I/dalvikvm-heap( 746): Grow heap (frag case) to 3.549MB for 1000016-byte allocation  
D/dalvikvm( 746): GC_FOR_MALLOC freed 170 objects/8488 bytes in 44ms  
D/MediaPlayer( 746): Couldn't open file on client side, trying server side  
V/MediaPlayerService( 67): Client(3) constructor  
V/MediaPlayerService( 67): Create new client(3) from pid 746, url=http://commonsware.com/misc/test.mp4, connId=3  
V/MediaPlayerService( 67): setDataSource(http://commonsware.com/misc/test.mp4)  
V/MediaPlayerService( 67): player type = 1  
V/MediaPlayerService( 67): create PVPlayer  
V/MediaPlayerService( 67): setDataSource  
V/MediaPlayerService( 67): [3] setVideoSurface(0x3cfd8)  
V/MediaPlayerService( 67): [3] setAudioStreamType(3)  
V/MediaPlayerService( 67): [3] prepareAsync  
V/MediaPlayerService( 67): [3] notify (0x3b2f8, 3, 0, 0)  
I/PlayerDriver( 67): buffering (1)  
V/MediaPlayerService( 67): [3] notify (0x3b2f8, 3, 1, 0)  
V/MediaPlayerService( 67): [3] notify (0x3b2f8, 200, 1, 26)  
W/MediaPlayer( 746): info/warning (1, 26)  
E/PlayerDriver( 67): Command PLAYER_INIT completed with an error or info PVMFErrResource  
V/MediaPlayerService( 67): [3] notify (0x3b2f8, 100, 1, -17)  
W/PlayerDriver( 67): PVMFInfoErrorHandlingComplete  
E/MediaPlayer( 746): error (1, -17)  
W/System.err( 746): java.io.IOException: Prepare failed.: status=0x1  
W/System.err( 746): at android.media.MediaPlayer.prepare(Native Method)  
W/System.err( 746): at com.video.mp.VideoSharingViaMPActivity.surfaceCreated(VideoSharingViaMPActivity.java:146) 
+2

请发布错误信息。 – ciphor 2012-01-31 04:07:11

+0

编辑帖子并添加了一些内容,似乎我误解了它,并且它没有准备(或prepareAsync,我得到了相同的结果) – alchemiss 2012-01-31 05:47:55

+0

您不应该在prepareAsync之后调用'gMp.start()',但是您应该添加'MediaPlayer.OnPreparedListener'通过'gMp.setOnPreparedListener()'。在这个听众中,是时候启动你的播放器了。 – OleGG 2012-01-31 12:10:12

回答

0

请检查:在你的代码中有链接http://www.commonsware.com/misc/test.mp4而真正的链接是没有www(也,我与我的浏览器检查,以www链接不存在)。

+0

哎。那真是令人尴尬。幸运的是,我在我的代码中没有www部分链接,仍然无法工作。 – alchemiss 2012-01-31 05:39:19

+0

哦,无论如何。我尝试了不同的编码程序,发现一个很好的工作。那么问题出在那个文件上。 – alchemiss 2012-02-01 11:16:11

0

您需要启动()/ reset()方法的媒体播放器第一。见有效和无效状态这里:http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States

+0

嗯,它已经是未初始化的,因为我创建了一个新的实例,因此没有任何理由要做reset()。 – alchemiss 2012-01-31 06:54:32

+0

恩,好吧。我的观点是根据情况可能需要start()或reset()。无论哪种方式,在调用setDataSource()之前,都需要将调用放在start()上。不过,在这一点上,你完全修改了你的问题,所以... – LuxuryMode 2012-01-31 15:26:33