• 解决SurfaceView有声音没图像的情况【转】


    使用SurfaceView播放视频,其实很简单,但是经常会碰见有声音没图像的问题.

    其实使用SurfaceView播放视频只需要主要下面几个地方就可以了

    1. surfaceChanged也就是Suface是否创建成功

    2. onPrepared 也就是MideoPlayer是否加载并准备完成

    3. surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 类型必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS

    java代码:

    1 package VideoTest.Test;
    2
    3  import java.io.FileDescriptor;
    4
    5 import android.app.Activity;
    6 import android.content.res.AssetFileDescriptor;
    7 import android.media.AudioManager;
    8 import android.media.MediaPlayer;
    9 import android.media.MediaPlayer.OnBufferingUpdateListener;
    10 import android.media.MediaPlayer.OnCompletionListener;
    11 import android.media.MediaPlayer.OnPreparedListener;
    12 import android.os.Bundle;
    13 import android.view.SurfaceHolder;
    14 import android.view.SurfaceView;
    15
    16
    17 public class VideoTest extends Activity implements SurfaceHolder.Callback,
    18 OnBufferingUpdateListener, OnCompletionListener, OnPreparedListener{
    19
    20 private SurfaceView surfaceView;
    21 private SurfaceHolder surfaceHolder;
    22 private MediaPlayer mediaPlayer;
    23
    24 @Override
    25 public void onCreate(Bundle savedInstanceState) {
    26 super.onCreate(savedInstanceState);
    27
    28 this.surfaceView = new SurfaceView(this);
    29 this.surfaceHolder = this.surfaceView.getHolder();
    30 this.surfaceHolder.addCallback(this);
    31
    32 //类型必须设置成SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS
    33 this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    34 setContentView(this.surfaceView);
    35 }
    36
    37 @Override
    38 public void onDestroy() {
    39 super.onDestroy();
    40 if (this.mediaPlayer != null) {
    41 this.mediaPlayer.release();
    42 this.mediaPlayer = null;
    43 }
    44 }
    45
    46 public void PlayVideo(){
    47
    48 try {
    49 //视频文件放在 assert中
    50 AssetFileDescriptor aFD = this.getAssets().openFd("welcome.3gp");
    51 FileDescriptor fileDescriptor = aFD.getFileDescriptor();
    52 this.mediaPlayer = new MediaPlayer();
    53 this.mediaPlayer.setDataSource(fileDescriptor, aFD.getStartOffset(), aFD.getLength());
    54 aFD.close();
    55
    56 //视频放在SDCard中
    57 //File sdFile = Environment.getExternalStorageDirectory();
    58 //this.mediaPlayer = new MediaPlayer();
    59 //this.mediaPlayer.setDataSource(sdFile.getAbsoluteFile() + File.separator + "welcome.3gp");
    60
    61 //视频放在res中
    62 //this.mediaPlayer = MediaPlayer.create(this, R.raw.welcome);
    63
    64 //网上的视频,没有测试
    65 //this.mediaPlayer
    66 // .setDataSource("http://xy2.163.com/download/down/wukong.mp3");
    67
    68 this.mediaPlayer.setDisplay(this.surfaceHolder);
    69 this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    70 //准备完成后才可以播放,另外如果文件特别大或者从网上获得的资源
    71 //会在这里等待时间过长,造成堵塞,这样的话就得用
    72 //this.mediaPlayer.prepareAsync(),然后监听是否准备完毕在开始
    73
    74 this.mediaPlayer.prepare();
    75 this.mediaPlayer.start();
    76
    77 } catch (Exception e) {
    78 // TODO: handle exception
    79 }
    80 }
    81
    82 @Override
    83 public void surfaceChanged(SurfaceHolder holder, int format, int width,
    84 int height) {
    85
    86 }
    87
    88 @Override
    89 public void surfaceCreated(SurfaceHolder holder) {
    90 //SurfaceCreated 创建成功才可以播放视频
    91 PlayVideo();
    92 }
    93
    94 @Override
    95 public void surfaceDestroyed(SurfaceHolder holder) {
    96
    97 }
    98
    99 //@Override
    100 public void onBufferingUpdate(MediaPlayer mp, int percent) {
    101 // TODO Auto-generated method stub
    102
    103 }
    104
    105 //@Override
    106 public void onCompletion(MediaPlayer mp) {
    107 // TODO Auto-generated method stub
    108
    109 }
    110
    111 //@Override
    112 public void onPrepared(MediaPlayer mp) {
    113 //MediaPlayer加载准备完毕才能开始播放
    114 //mp.start();
    115 }
    116
    117 }
  • 相关阅读:
    leetcode_697. 数组的度
    645. 错误的集合
    leetcode_448. 找到所有数组中消失的数字
    leetcode_628. 三个数的最大乘积
    leetcode_414. 第三大的数
    leetcode_495. 提莫攻击
    leetcode_485. 最大连续1的个数
    在 Mac、Linux、Windows 下Go交叉编译
    Goland基本操作
    etcd搭建及基本使用
  • 原文地址:https://www.cnblogs.com/etgyd/p/2007918.html
Copyright © 2020-2023  润新知