安卓视频,听到声音,但没有视频

时间:2010-02-02 13:37:38

标签: android video media-player surfaceview

我尝试了几个不同的例子,但我无法显示任何视频。我听到声音但没有视频。我想也许我只是有一个不正确的视频格式,所以我下载了一个3gp格式的法国商业广告,但仍然没有喜悦。我正在使用带有android sdk的Eclipse Java EE,而我的应用程序的目标是1.5 sdk(Api Level 3)而没有google api。有人可以发布链接到已知在Android中播放的视频或指出我的代码问题。我已经尝试了所有我能想到的......有/没有准备..不同的布局等。

这是我的onCreate in activity

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

this.setContentView(R.layout.video_test);
    SurfaceView v = (SurfaceView) findViewById(R.id.surface_video); 
    SurfaceHolder holder = v.getHolder(); 
 // Set the transparency 
    //getWindow().setFormat(PixelFormat.UNKNOWN); 


    // Set a size for the video screen 
    //holder.addCallback(this); 
    holder.setFixedSize(400,300); 


    MediaPlayer mp = MediaPlayer.create(this, R.raw.fiat); 
    mp.setDisplay(holder);
    //mp.setAudioStreamType(2); 
    try {
        //mp.prepare();
        mp.start();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

她是video_test.xml中的布局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<SurfaceView android:id="@+id/surface_video" 
android:layout_width="250px" 
android:layout_height="250px"> 
</SurfaceView> 
<LinearLayout 
android:orientation="horizontal" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent" 
android:padding="10dip" 
> 
</LinearLayout> 
</LinearLayout> 

&GT;块引用

6 个答案:

答案 0 :(得分:17)

你的类必须实现SurfaceHolder.Callback,并且只有在进入surfaceCreated后才调用方法setDisplay,prepare等。此外,您可能需要将Surface支架的类型更改为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS。像这样:

import android.view.SurfaceHolder.Callback;

public class TestActivity extends Activity implements Callback {

// ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...
        mSurfaceView = (SurfaceView)findViewById(R.id.yousurfaceview); 
        holder = mSurfaceView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mp.setDisplay(holder);
        mp.setDataSource(somesource);
        mp.prepare();
        mp.start();
        // etc...
    } catch (IOException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalStateException e) {
    }

}

// ...
}

如果你在OnCreate中尝试它,你没有得到任何结果,因为Surface尚未创建......

答案 1 :(得分:1)

如果您使用的是模拟器,则可能无效。模拟器缺少Android设备中可用的硬件加速。例如,在2.6GHz Core 2 Duo上,我有时可以播放视频,但并非总是如此。在较慢的机器上,视频播放永远不会奏效在2.5GHz Core 2 Quad上,我总是可以播放视频。话虽这么说,我通常会在实际设备上测试视频播放。

我也不确定视频播放是否来自原始资源。我强烈建议您先尝试使用SD卡上文件中的视频。

对于肯定有效的视频,我知道来自here的“纪录片与你”和“我们的孙子们的音乐”都是以他​​们的MP4形式工作的。

答案 2 :(得分:1)

您可以通过查看Android ApiDemo示例应用程序(查看“媒体”下的示例)获得完整示例:http://developer.android.com/resources/samples/ApiDemos/index.html

对于与演示一起使用的示例电影,我已成功使用YouTube移动网站的链接。

答案 3 :(得分:0)

我遇到了同样的问题。我能够通过在XML布局文件中将SurfaceView更改为VideoView来修复它。保持所有其余代码相同。这对我有用,不知道为什么。

答案 4 :(得分:0)

这是一个老问题,但我的回答可能有助于某人。

要支持旧版Android,您需要添加以下内容:

videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

答案 5 :(得分:0)

给定视频文件是否会在给定播放器中播放取决于三件事:

  • 视频容器格式(文件类型)。
  • 编解码器视频(和潜在的音频)流编码; 您的播放器对容器格式和编解码器组合的支持
  • 编解码器和播放器/设备支持几乎可以肯定是您所看到的不一致结果的原因。 (编解码器,如果你不知道,基本上是一个可重复的数学公式,它告诉你的系统如何将打包到文件中的位和字节转换成动态图像(并且再次返回),就此而言)。