Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

第 123 章 多媒体开发

目录

123.1. MediaPlayer
123.1.1. 播放Raw下的元数据
123.1.2. 播放assets文件夹中的音乐
123.1.3. 播放互联网音乐
123.1.4. 使用单例模式
123.1.5. 设置速度,快进播放
123.2. VideoView 开发
123.2.1. 播放网络视频
123.2.2. MediaController 添加翻页事件
123.2.3. 静音播放视频
123.2.4. 更新进度条
123.2.5. 完整的例子
123.2.6. 循环播放
123.2.7. 静音播放
123.3. SoundPool
123.4. 音量控制
123.5. SurfaceView
123.6. Vitamio

123.1. MediaPlayer

123.1.1. 播放Raw下的元数据

播放一段特效声音,例如铃音,可以在点击按钮德时候调用 playSound()

			
	private void playSound(){

        MediaPlayer mediaPlayer = MediaPlayer.create(FlashLightActivity.this, R.raw.alert);
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mediaPlayer.release();
            }
        });
        mediaPlayer.start();
    }
			
			

播放 res 中的资源文件

			
	AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(R.raw.music);		

    public void play(AssetFileDescriptor assetFileDescriptor) {
        if (mediaPlayer != null) {
            try {
                this.reset();
                mediaPlayer.setDataSource(assetFileDescriptor);
                // 或使用这种方式 mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
                mediaPlayer.prepare();
                //注意不能使用异步,异步方式是用来播放网络流音乐
				// mediaPlayer.prepareAsync(); 
                assetFileDescriptor.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            mediaPlayer.start();
        }
    }
			
			

播放 assets 文件夹中的资源

			
//实例化播放器
MediaPlayer mediaPlayer = new MediaPlayer();
AssetManager am = getAssets();
try {
    AssetFileDescriptor afd = am.openFd("assets_video.mp4");
    mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
    e.printStackTrace();
}
//设置准备就绪状态监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
         // 开始播放
         mediaPlayer.start();
     }
});
//准备播放
mediaPlayer.prepareAsync();		
			
			

其他方式获得 assets 文件夹中的资源

			
		String url = "file:///android_asset/" + "video.mp3";	
        AssetFileDescriptor assetFileDescriptor = null;
        try {
            assetFileDescriptor = context.getResources().getAssets().openFd("nepal.mp3");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }			
			
			

123.1.2. 播放assets文件夹中的音乐

			
 //需将资源文件放在assets文件夹
 AssetFileDescriptor fd = getAssets().openFd("samsara.mp3");
 mMediaPlayer.setDataSource(fd)
 mMediaPlayer.prepare() 
 
 AssetFileDescriptor fd = getAssets().openFd("samsara.mp3");
 mMediaPlayer.setDataSource(fd, fd.getStartOffset(), fd.getLegth())
 mMediaPlayer.prepare();			
			
			

123.1.3. 播放互联网音乐

			
package cn.netkiller.demo.skill;

import android.media.MediaPlayer;
import android.util.Log;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.IOException;

public class Bible {
    private static final String TAG = Bible.class.getSimpleName();

    public Bible(JSONArray array) {
        Log.i(TAG, array.toString());
        JSONObject item = (JSONObject) array.get(1);
        String url = item.getString("url");
        Log.i(TAG, "Audio url: " + url);
        MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(url);//设置播放来源
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mediaPlayer.prepareAsync();//异步准备
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //异步准备监听
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {

                Log.i(TAG, "Voice异步文件时长: " + mediaPlayer.getDuration() / 1000 + "");
                mediaPlayer.start();//播放
            }
        });
        mediaPlayer.setScreenOnWhilePlaying(true);// 设置播放的时候一直让屏幕变亮
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            //文件缓冲监听
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {

                Log.i(TAG, "Voice进度: " + i + "% Voice文件长度" + mediaPlayer.getDuration() / 1000 + "");
            }
        });
    }
}
 		
			
			

123.1.4. 使用单例模式

			
package cn.netkiller.demo.skill;

import android.media.MediaPlayer;
import android.util.Log;

import androidx.annotation.NonNull;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.io.IOException;

public class Bible {
    private static final String TAG = Bible.class.getSimpleName();

    private static MediaPlayer mediaPlayer;

    public synchronized static MediaPlayer getInstance() {
        if (mediaPlayer == null)
            mediaPlayer = new MediaPlayer();
        return mediaPlayer;
    }

    public Bible(@NonNull JSONArray array) {
//        Log.i(TAG, array.toString());
        JSONObject item = (JSONObject) array.get(1);
        String url = item.getString("url");
//        Log.i(TAG, "Audio url: " + item.toString());
        MediaPlayer mediaPlayer = Bible.getInstance();
        try {
            mediaPlayer.reset();
            mediaPlayer.setDataSource(url);//设置播放来源
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mediaPlayer.prepareAsync();//异步准备
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            //异步准备监听
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.i(TAG, "Voice 播放异步文件,时长: " + mediaPlayer.getDuration() / 1000 + " Audio: " + item.toString());
                mediaPlayer.start();//播放
            }
        });
        mediaPlayer.setScreenOnWhilePlaying(true);// 设置播放的时候一直让屏幕变亮
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            //文件缓冲监听
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
                Log.i(TAG, "Voice 缓冲区加载进度: " + i + "%");
            }
        });
    }
}
			
			
			

123.1.5. 设置速度,快进播放

			
                PlaybackParams params = new PlaybackParams();
//                params.setSpeed(1.5f);
                params.setSpeed(5f);
                mediaPlayer.setPlaybackParams(params);