7

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

这是我在活动中的 onCreate

/** 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> 

> 块引用

4

6 回答 6

17

你的类必须实现 SurfaceHolder.Callback 并调用方法 setDisplay、prepare 等,只有在你进入 SurfaceCreated 之后。此外,您可能需要将表面支架的类型更改为 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 尚未创建...

于 2012-04-04T08:49:07.657 回答
1

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

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

关于绝对有效的视频,我知道这里的“纪录片和你”和“我们的孙子的音乐”以 MP4 形式工作。

于 2010-02-02T14:00:20.407 回答
1

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

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

于 2010-08-11T17:36:29.350 回答
0

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

于 2011-09-14T05:06:45.087 回答
0

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

要支持旧版本的 Android,您需要添加以下行:

videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
于 2014-10-13T14:32:29.413 回答
0

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

  • 视频容器格式(文件类型)。
  • 视频(可能还有音频)流编码的编解码器;您的播放器对容器格式和编解码器组合的支持
  • 几乎可以肯定,编解码器和播放器/设备支持是您看到的结果不一致的原因。(如果您不知道,编解码器基本上是一个可重复的数学公式,它告诉您的系统如何将打包到文件中的位和字节转换为运动图片(就此而言,再返回))
于 2015-09-15T05:39:45.350 回答