`
zhangyf1987hb
  • 浏览: 83925 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android SurfaceView播放视频有声音无图像问题

阅读更多

在用SurfaceView播放视频时,如果处理不当,会出现有声音无图像的问题,主要的原因是,在调用MediaPlayer开始播放视频时,SurfaceView却还未创建成功,解决办法是判断SurfaceView创建成功后再调用MediaPlayer的播放,通过surfaceHolder的addCallBack()方法来监听surfaceCreated。

 

以下是2段源码,第1段有声音无图像,第2段有声音有图像

 

源码1:有声音无图像

[html] view plaincopy
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.MediaPlayer;  
  4. import android.os.Bundle;  
  5. import android.view.SurfaceHolder;  
  6. import android.view.SurfaceView;  
  7.   
  8. public class MainActivity extends Activity  
  9. {     
  10.     private SurfaceView surfaceView = null ;  
  11.     private SurfaceHolder surfaceHolder = null ;  
  12.     private MediaPlayer mp = null ;  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState)    
  17.     {  
  18.         super.onCreate(savedInstanceState);  
  19.         surfaceView = new SurfaceView(this);  
  20.         surfaceHolder = surfaceView.getHolder();          
  21.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  22.         setContentView(surfaceView);  
  23.           
  24.         mp = new MediaPlayer();          
  25.         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  26.         mp.setDisplay(surfaceHolder);  
  27.         try {  
  28.             mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");  
  29.         } catch (Exception e) {  
  30.             // TODO Auto-generated catch block  
  31.             e.printStackTrace();  
  32.         }  
  33.         try {  
  34.             mp.prepare();  
  35.         } catch (Exception e) {  
  36.             // TODO Auto-generated catch block  
  37.             e.printStackTrace();  
  38.         }  
  39.         mp.start();         
  40.   
  41.     }  
  42. }  


 

 

源码2:有声音有图像

[html] view plaincopy
  1. import android.app.Activity;  
  2. import android.media.AudioManager;  
  3. import android.media.MediaPlayer;  
  4. import android.os.Bundle;  
  5. import android.view.SurfaceHolder;  
  6. import android.view.SurfaceView;  
  7.   
  8. public class MainActivity extends Activity implements SurfaceHolder.Callback  
  9. {     
  10.     private SurfaceView surfaceView = null ;  
  11.     private SurfaceHolder surfaceHolder = null ;  
  12.     private MediaPlayer mp = null ;  
  13.   
  14.     /** Called when the activity is first created. */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState)    
  17.     {  
  18.         super.onCreate(savedInstanceState);  
  19.         surfaceView = new SurfaceView(this);  
  20.         surfaceHolder = surfaceView.getHolder();          
  21.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  22.         surfaceHolder.addCallback(this);  
  23.         setContentView(surfaceView);  
  24.           
  25.   
  26.     }  
  27.   
  28.     @Override  
  29.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  30.             int height) {  
  31.         // TODO Auto-generated method stub  
  32.           
  33.     }  
  34.   
  35.     @Override  
  36.     public void surfaceCreated(SurfaceHolder holder) {  
  37.         // TODO Auto-generated method stub  
  38.         mp = new MediaPlayer();          
  39.         mp.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  40.         mp.setDisplay(surfaceHolder);  
  41.         try {  
  42.             mp.setDataSource("/sdcard/DownAndPlay/xyj.mp4");  
  43.         } catch (Exception e) {  
  44.             // TODO Auto-generated catch block  
  45.             e.printStackTrace();  
  46.         }  
  47.         try {  
  48.             mp.prepare();  
  49.         } catch (Exception e) {  
  50.             // TODO Auto-generated catch block  
  51.             e.printStackTrace();  
  52.         }  
  53.         mp.start();  
  54.     }  
  55.   
  56.     @Override  
  57.     public void surfaceDestroyed(SurfaceHolder holder) {  
  58.         // TODO Auto-generated method stub  
  59.           
  60.     }  
  61.   
分享到:
评论

相关推荐

    Android下使用SurfaceView播放视频文件

    在Android平台上,SurfaceView是一种特殊的视图,常用于处理高性能的图形渲染,比如播放视频或者游戏画面。在视频播放场景中,SurfaceView提供了一个高效且低延迟的显示机制,能够将视频帧直接绘制到Surface上,减少...

    SurfaceView播放视频放大缩小功能.zip

    这个压缩包文件"SurfaceView播放视频放大缩小功能.zip"显然包含了实现SurfaceView在播放视频时进行放大和缩小功能的相关代码和资源。以下是关于SurfaceView播放视频以及实现放大缩小功能的核心知识点: 1. **...

    Android SurfaceView 实现实时显示摄像头视频

    `SurfaceView`是Android提供的一种用于高效显示多媒体数据的视图组件,尤其适合处理像视频流这样的实时数据。本篇文章将深入探讨如何利用`SurfaceView`实现实时显示摄像头视频。 首先,我们需要了解`SurfaceView`的...

    使用SurfaceView播放视频

    2. **使用SurfaceView播放视频的步骤** - 创建`SurfaceView`:在布局文件中添加`SurfaceView`组件,或者在代码中动态创建并添加到视图层次中。 - 获取`SurfaceHolder`:`SurfaceView`有一个关联的`SurfaceHolder`...

    Android移动开发-使用MediaPlayer和SurfaceView播放视频的实现

    使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...

    本示例使用 SurfaceView 播放视频

    以上就是使用SurfaceView和MediaPlayer播放视频的基本步骤和关键知识点。在实际项目中,可能还需要考虑其他因素,如错误处理、音量控制、全屏切换等,以提供更好的用户体验。通过深入理解和实践,你可以创建出更复杂...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    SurfaceView增加放大缩小视频功能

    在Android开发中,`SurfaceView` 是一个非常重要的视图组件,主要用于处理视频播放、游戏图形等高性能的图像渲染任务。`SurfaceView` 提供了一个独立的绘图表面,可以与应用程序主线程分离,从而避免UI阻塞,提高...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    android surfaceView实现播放视频功能

    Android SurfaceView 实现播放视频功能 Android SurfaceView 是 Android 系统中的一种视图组件,主要用于显示视频、图像和三维图形等多媒体内容。今天,我们将详细介绍如何使用 Android SurfaceView 实现播放视频...

    android surfaceview自定义拍照 绘制头像轮廓

    首先,`SurfaceView`是Android系统中一种特殊的View,它可以创建一个独立于应用主线程的绘图表面,这使得它非常适合用于处理高性能的图形操作,比如视频播放或实时摄像头预览。它的绘图过程是在一个单独的...

    SurfaceView放大和缩小

    在Android开发中,SurfaceView是一种特殊的视图,用于高效地显示动态图像,比如播放视频或者进行游戏渲染。标题“SurfaceView放大和缩小”涉及到的是如何在Android应用中实现对SurfaceView内的视频画面进行局部放大...

    android SurfaceView做二维码扫描源码

    在Android开发中,实现二维码和一维码扫描功能通常涉及到多个关键知识点,其中包括SurfaceView的使用、摄像头控制、图像处理以及二维码识别库的集成。以下将详细解释这些内容。 首先,`SurfaceView`是Android系统...

    SurfaceView播放视频

    总结来说,"SurfaceView播放视频"是一个典型Android多媒体应用开发中的场景,涉及到了`SurfaceView`、`MediaPlayer`、`AssetManager`以及可能的电视设备适配和对话框操作。理解和掌握这些知识点对于开发高效、流畅的...

    android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的动画或视频播放成为可能。在这个“android SurfaceView实现人物动画”的示例程序中,我们将深入探讨如何利用...

    Android SurfaceView添加组件view不被组件覆盖.zip

    SurfaceView通常用于视频播放、游戏或者需要频繁更新图像的场景。然而,有时候当我们尝试在SurfaceView上添加其他View时,可能会遇到这些View被SurfaceView覆盖的问题。这个问题通常涉及到Android的视图层次和渲染...

    安卓Android源码——SurfaceView添加组件view不被组件覆盖.zip

    在安卓开发中,`SurfaceView` 是一个非常重要的视图组件,它允许开发者在应用程序中创建一个独立于窗口管理器的表面,这个表面可以用于显示持续更新的图像,如视频播放或者游戏画面。`SurfaceView` 提供了一个优化的...

    Android SurfaceView实现加载GIF动画

    在Android开发中,`SurfaceView`是一个非常重要的组件,它为高效显示动态图像和视频提供了可能。本篇文章将深入探讨如何使用`SurfaceView`来实现加载GIF动画,这是一个常见的需求,特别是在游戏开发或者需要实时渲染...

    Android SurfaceView实现人物动画

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,特别是用于实现动画效果,如游戏或者视频播放等。SurfaceView拥有自己的绘图表面,与主线程分离,因此在处理复杂的...

    最简单的surfaceview画图和截图

    SurfaceView是Android系统提供的一种特殊的View,主要用于处理高性能、低延迟的图形绘制,例如游戏画面或者视频播放等场景。它的核心特性在于拥有自己的独立线程(SurfaceThread)来管理Surface的绘制,这使得...

Global site tag (gtag.js) - Google Analytics