我尝试了几个不同的例子,但我无法显示任何视频。我听到声音但没有视频。我想也许我只是有一个不正确的视频格式,所以我下载了一个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;块引用
答案 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)
给定视频文件是否会在给定播放器中播放取决于三件事: