在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。
以下是2段源码,第1段有声音无图像,第2段有声音有图像
源码1:有声音无图像
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MainActivity extends Activity
- {
- private SurfaceView surfaceView = null ;
- private SurfaceHolder surfaceHolder = null ;
- private MediaPlayer mp = null ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- surfaceView = new SurfaceView(this);
- surfaceHolder = surfaceView.getHolder();
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- setContentView(surfaceView);
- mp = new MediaPlayer();
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.setDisplay(surfaceHolder);
- try {
- mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- mp.prepare();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mp.start();
- }
- }
源码2:有声音有图像
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MainActivity extends Activity implements SurfaceHolder.Callback
- {
- private SurfaceView surfaceView = null ;
- private SurfaceHolder surfaceHolder = null ;
- private MediaPlayer mp = null ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- surfaceView = new SurfaceView(this);
- surfaceHolder = surfaceView.getHolder();
- surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceHolder.addCallback(this);
- setContentView(surfaceView);
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- // TODO Auto-generated method stub
- }
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- mp = new MediaPlayer();
- mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mp.setDisplay(surfaceHolder);
- try {
- mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- mp.prepare();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mp.start();
- }
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- // TODO Auto-generated method stub
- }
相关推荐
在Android平台上,SurfaceView是一种特殊的视图,常用于处理高性能的图形渲染,比如播放视频或者游戏画面。在视频播放场景中,SurfaceView提供了一个高效且低延迟的显示机制,能够将视频帧直接绘制到Surface上,减少...
这个压缩包文件"SurfaceView播放视频放大缩小功能.zip"显然包含了实现SurfaceView在播放视频时进行放大和缩小功能的相关代码和资源。以下是关于SurfaceView播放视频以及实现放大缩小功能的核心知识点: 1. **...
`SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将深入探讨如何利用`SurfaceView`实现实时显示摄像头视频。 首先,我们需要了解`SurfaceView`的...
2. **使用SurfaceView播放视频的步骤** - 创建`SurfaceView`:在布局文件中添加`SurfaceView`组件,或者在代码中动态创建并添加到视图层次中。 - 获取`SurfaceHolder`:`SurfaceView`有一个关联的`SurfaceHolder`...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...
以上就是使用SurfaceView和MediaPlayer播放视频的基本步骤和关键知识点。在实际项目中,可能还需要考虑其他因素,如错误处理、音量控制、全屏切换等,以提供更好的用户体验。通过深入理解和实践,你可以创建出更复杂...
在Android开发中,`SurfaceView` 是一个非常重要的视图组件,主要用于处理视频播放、游戏图形等高性能的图像渲染任务。`SurfaceView` 提供了一个独立的绘图表面,可以与应用程序主线程分离,从而避免UI阻塞,提高...
在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...
首先,`SurfaceView`是Android系统中一种特殊的View,它可以创建一个独立于应用主线程的绘图表面,这使得它非常适合用于处理高性能的图形操作,比如视频播放或实时摄像头预览。它的绘图过程是在一个单独的...
Android SurfaceView 实现播放视频功能 Android SurfaceView 是 Android 系统中的一种视图组件,主要用于显示视频、图像和三维图形等多媒体内容。今天,我们将详细介绍如何使用 Android SurfaceView 实现播放视频...
在Android开发中,实现二维码和一维码扫描功能通常涉及到多个关键知识点,其中包括SurfaceView的使用、摄像头控制、图像处理以及二维码识别库的集成。以下将详细解释这些内容。 首先,`SurfaceView`是Android系统...
总结来说,"SurfaceView播放视频"是一个典型Android多媒体应用开发中的场景,涉及到了`SurfaceView`、`MediaPlayer`、`AssetManager`以及可能的电视设备适配和对话框操作。理解和掌握这些知识点对于开发高效、流畅的...
在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...
SurfaceView通常用于视频播放、游戏或者需要频繁更新图像的场景。然而,有时候当我们尝试在SurfaceView上添加其他View时,可能会遇到这些View被SurfaceView覆盖的问题。这个问题通常涉及到Android的视图层次和渲染...
在Android开发中,SurfaceView是一种特殊的视图,用于高效地显示动态图像,比如播放视频或者进行游戏渲染。标题“SurfaceView放大和缩小”涉及到的是如何在Android应用中实现对SurfaceView内的视频画面进行局部放大...
在安卓开发中,`SurfaceView` 是一个非常重要的视图组件,它允许开发者在应用程序中创建一个独立于窗口管理器的表面,这个表面可以用于显示持续更新的图像,如视频播放或者游戏画面。`SurfaceView` 提供了一个优化的...
在Android开发中,`SurfaceView`是一个非常重要的组件,它为高效显示动态图像和视频提供了可能。本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染...
在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,特别是用于实现动画效果,如游戏或者视频播放等。SurfaceView拥有自己的绘图表面,与主线程分离,因此在处理复杂的...
SurfaceView是Android系统提供的一种特殊的View,主要用于处理高性能、低延迟的图形绘制,例如游戏画面或者视频播放等场景。它的核心特性在于拥有自己的独立线程(SurfaceThread)来管理Surface的绘制,这使得...