mediaplayer
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于mediaplayer内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在mediaplayer相关知识领域提供全面立体的资料补充。同时还包含 machine_start、macox、magellan 的知识内容,欢迎查阅!
mediaplayer相关知识
-
教你用MediaPlayer做个带进度条的音乐播放器效果图布局文件好像还有点小清新???布局文件MediaPlayer的使用/** * 初始化播放器MediaPlayer */private void initMediaPlayer() { //1. 加载选中歌曲 try { //1.1 设置音频文件路径, 或者是资源uri if (mType == 1) { mediaPlayer.setDat
-
一个封装好的SurfaceView+MediaPlayer开源视频播放器 第一次写博客,写的不好大家见谅哈。 由于我们公司业务是Android电视端,很多都用到了视频播放,而且运用到的地点非常多,自己也入码农的坑也没多久,刚开始在不同的播放页面都写了播放器,也试了ijkplayer和exoplayer,虽然方便,功能强大,但是对于我们公司并不是特别适用,所以我毅然决然的把SurfaceView+MediaPlayer播放器给封装起来了,称他wanbaplayer,下面就简单的介绍一下。 在wanbaplayer里,我首先做了一个callback回调,回调有开始播放视频的回调,播放时进度的回调和播放结束后的回调,开始播放时的回调我也会回调一个以秒为单位的int值,这是播放视频的总时长。 &nb
-
说说 Android 中如何操作音频与视频文件1 音频在 Android 中播放音频文件用的是 MediaPlayer 类,它提供了一些较为常用的控制方法。方法说明setDataSource()指定音频文件位置。prepare()准备播放之前完成准备工作。start()开始或继续播放音频。pause()暂停播放音频。reset()将 MediaPlayer 对象重置到刚刚创建的状态。seekTo()从指定位置开始播放。stop()停止播放。调用后,MediaPlayer 对象将无法再播放。release()释放与 MediaPlayer 对象相关的资源。isPlaying()判断是否正在播放。getDuration()获取音频文件的时长。工作流程如下:创建 MediaPlayer 对象。设置音频文件路径。进入准备状态。开始播放音频。布局文件:<?xml version="1.0" encoding="utf-8"?><LinearLayout 
-
MediaPlay和VideoViewMediaPlay和VideoViewAndroid 系统中提供开发者开发多媒体应用(音视频方面)一、MediaPlayMediaPlay,解码的是底层,MediaPlayer负责和底层打交道,封装了很多方法start,pause,stop,播放视频的类这个MediaPlayer可以播放本地和网络的音视频1.执行流程 reset()[图片上传失败...(image-c5630a-1533812415516)]变release(),prepareAsnyc,seekTo(), 2.视频支持的格式 mp4,3gp,m3u8 直接用pc的.mp4文件要看码率是否支持二、VideoView显示视频,继承自SurfaceView类,实现MediaPlayerControl接口,封装了MediaPlayer start,pause,stop,本质上是调用MediaPlayerSurfaceView 默认使用双缓冲技术,它支持在子线程中绘制图像,这样就不会阻塞主线程了,它适合游戏和多媒体的开发 surfaceCreate
mediaplayer相关课程
mediaplayer相关教程
- 3. MediaPlayer 使用步骤 Android 系统为 MediaPlayer 适配了多种场景,也为不同的场景提供了不同的使用方式,但大体上有几个步骤:创建播放器创建通常有两种方法:MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.song);MediaPlayer mediaPlayer = new MediaPlayer();第一种方式直接在创建的时候传入媒体流地址,而第二种仅仅是创建一个“Idle”态的闲置播放器设置媒体源Android 提供下面的方法设置媒体数据源mediaPlayer.setDataSource(www.mc.com/mc.mp3);如果在创建 MediaPlayer 的时候就设置了媒体文件,那么可以跳过这一步开始播放在设置好媒体源地址之后,就可以开始播放了:mediaPlayer.start();播放控制在播放过程中可以调用一些控制 API 进行播放状态的控制结束播放调用stop()可以结束播放,并且记得在不用的时候还要调用release()
- 媒体播放器:MediaPlayer Android 系统提供了几种播放音频和视频的方式,其中最常用的就是 MediaPlayer,和其他功能组件一样都有很多第三方框架提供更加丰富完备的功能,但是基本用法和时序基本都是参照 MediaPlayer 来设计的,本节就来看看 MediaPlayer 的使用方法。
- 1. MediaPlayer 的状态 MediaPlayer 有一套完善的状态机,通常出现一些奇怪的报错或者 Crash 大概率就是状态流转出了问题,而市面上大多数的播放器也会遵循 Android 官方设计的这套状态机来实现。首先看看所有的状态:Idle:空闲态,刚创建或者调用了reset()之后的状态,此时不能进行播放Initailized:初始化态,仅仅设置了媒体源,但还未进行任何网络资源的拉取或者媒体流的解析,此时仍然不能播放Preparing:准备中,触发了媒体流的下载以及媒体流的解析,但均未完成,处于准备中,尚不能进行播放Prepared:准备好,已经将媒体资源拉取并解析完成,随时可以开始播放Started:播放态,在媒体资源准备好之后,调用了start()触发了媒体的播放,则进入视频 / 音频播放Paused:暂停态,这个很好理解,视频 / 音频播放暂停,此时可以随时调用start()继续播放回到Started状态PlaybackCompleted:播放结束态,视频 / 音频播放到结尾,自然结束Stoped:停止态,在播放或者暂停过程中主动调用stop()停止播放,注意它和暂停态不同,“Stoped”态不能直接回到播放态;它和播放结束态也不同,“Stoped”一定是由开发者主动触发的End:释放态,播放器调用release()触发播放器资源的释放,此时播放器资源被回收将不能使用Error:错误态,如果由于某种原因 MediaPlayer 出现了错误,会触发 OnErrorListener.onError()事件,此时 MediaPlayer 即进入 Error 状态,及时捕捉并妥善处理这些错误是很重要的,可以帮助我们及时释放相关的软硬件资源,也可以改善用户体验。通过setOnErrorListener可以设置该监听器。如果MediaPlayer进入了Error状态,可以通过调用reset()来恢复,使得MediaPlayer重新返回到 Idle 状态。下面可以对照着状态看看官方给的状态机流转图:这个图非常经典,建议大家收藏此文章,今后使用 MediaPlayer 过程中出现任何问题都可以看看状态机是否出现异常。
- 4.1 MediaPlayer 的使用 首先看看 MainActivity:package com.emercy.myapplication;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.Button;import android.widget.SeekBar;import android.widget.TextView;import android.widget.Toast;import java.util.concurrent.TimeUnit;public class MainActivity extends Activity { private Button b1, b2, b3, b4; private MediaPlayer mediaPlayer; private double startTime = 0; private double finalTime = 0; private Handler myHandler = new Handler(); private int forwardTime = 5000; private int backwardTime = 5000; private SeekBar seekbar; private TextView tx1, tx2, tx3; public static int oneTimeOnly = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.button); b2 = (Button) findViewById(R.id.button2); b3 = (Button) findViewById(R.id.button3); b4 = (Button) findViewById(R.id.button4); tx1 = (TextView) findViewById(R.id.textView2); tx2 = (TextView) findViewById(R.id.textView3); tx3 = (TextView) findViewById(R.id.textView4); mediaPlayer = MediaPlayer.create(this, R.raw.video); seekbar = (SeekBar) findViewById(R.id.seekBar); seekbar.setClickable(false); b2.setEnabled(false); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int) startTime; if ((temp + forwardTime) <= finalTime) { startTime = startTime + forwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(), "前进5秒", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "前方还剩不到5秒", Toast.LENGTH_SHORT).show(); } } }); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Pausing sound", Toast.LENGTH_SHORT).show(); mediaPlayer.pause(); b2.setEnabled(false); b3.setEnabled(true); } }); b3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "音频播放", Toast.LENGTH_SHORT).show(); mediaPlayer.start(); finalTime = mediaPlayer.getDuration(); startTime = mediaPlayer.getCurrentPosition(); if (oneTimeOnly == 0) { seekbar.setMax((int) finalTime); oneTimeOnly = 1; } tx2.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) ); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) ); seekbar.setProgress((int) startTime); myHandler.postDelayed(UpdateSongTime, 100); b2.setEnabled(true); b3.setEnabled(false); } }); b4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int) startTime; if ((temp - backwardTime) > 0) { startTime = startTime - backwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(), "后退5秒", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "后方还剩不到5秒", Toast.LENGTH_SHORT).show(); } } }); } private Runnable UpdateSongTime = new Runnable() { public void run() { startTime = mediaPlayer.getCurrentPosition(); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. toMinutes((long) startTime))) ); seekbar.setProgress((int) startTime); myHandler.postDelayed(this, 100); } };}通过MediaPlayer.create(this, R.raw.video)创建一个 MediaPlayer 对象并初始化媒体流地址,然后分别设置几个控制 Button 的监听事件,实现播放器的前进、后退、播放、暂停操作,当中还有一个UpdateSongTime的 Runnable 变量,用来每隔 100 毫秒更新一次播放进度,实现播放进度的同步刷新。
- 2. MediaPlayer 常用 API 使用 MediaPlayer 的 API 之前一定要先熟悉熟悉再熟悉上一小节的状态机时序图,否则盲目使用 API 会出现很多状态错误的异常发生。setDataSource(FileDescriptor fd):设置音频 / 视频资源地址isPlaying():判断当前视频 / 音频是否正在播放seekTo(position):直接跳转到视频 / 音频的某个时间点getCurrentPosition():获取当前的播放进度getDuration():获取媒体文件的总时长reset():重置 MediaPlayer,此后会进入 Idle 态release():释放播放器,在不使用的时候调用,节省系统资源setVolume(float leftVolume, float rightVolume):设置媒体音量selectTrack(int index):设置媒体轨道getTrackInfo():返回一个数组,包含所有的轨道信息
- 3.1 MediaRecorder 控制逻辑 作为一个完整的录音功能,当然在录音结束之后也得要能回放录音。所以整个的控制要分为录音控制和播放控制,我们按照上一小节讲述的步骤用 MediaRecorder 完成录音,然后调用 MediaPlayer 来完成录音回放:package com.emercy.myapplication;import android.app.Activity;import android.content.pm.PackageManager;import android.media.MediaPlayer;import android.media.MediaRecorder;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.Button;import android.widget.Toast;import java.io.IOException;import java.util.Random;import static android.Manifest.permission.RECORD_AUDIO;import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;public class MainActivity extends Activity { Button buttonStart, buttonStop, buttonPlayLastRecordAudio, buttonStopPlayingRecording; String AudioSavePathInDevice = null; MediaRecorder mediaRecorder; Random random; String RandomAudioFileName = "emercy"; public static final int RequestPermissionCode = 1; MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonStart = findViewById(R.id.button); buttonStop = findViewById(R.id.button2); buttonPlayLastRecordAudio = findViewById(R.id.button3); buttonStopPlayingRecording = findViewById(R.id.button4); buttonStop.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(false); buttonStopPlayingRecording.setEnabled(false); random = new Random(); buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (checkPermission()) { AudioSavePathInDevice = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + CreateRandomAudioFileName(5) + "AudioRecording.3gp"; MediaRecorderReady(); try { mediaRecorder.prepare(); mediaRecorder.start(); } catch (IllegalStateException | IOException e) { e.printStackTrace(); } buttonStart.setEnabled(false); buttonStop.setEnabled(true); Toast.makeText(MainActivity.this, "Recording started", Toast.LENGTH_LONG).show(); } else { requestPermission(); } } }); buttonStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mediaRecorder.stop(); buttonStop.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(true); buttonStart.setEnabled(true); buttonStopPlayingRecording.setEnabled(false); Toast.makeText(MainActivity.this, "Recording Completed", Toast.LENGTH_LONG).show(); } }); buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) throws IllegalArgumentException, SecurityException, IllegalStateException { buttonStop.setEnabled(false); buttonStart.setEnabled(false); buttonStopPlayingRecording.setEnabled(true); mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(AudioSavePathInDevice); mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); Toast.makeText(MainActivity.this, "录音完毕", Toast.LENGTH_LONG).show(); } }); buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { buttonStop.setEnabled(false); buttonStart.setEnabled(true); buttonStopPlayingRecording.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(true); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); MediaRecorderReady(); } } }); } public void MediaRecorderReady() { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); mediaRecorder.setOutputFile(AudioSavePathInDevice); } public String CreateRandomAudioFileName(int string) { StringBuilder stringBuilder = new StringBuilder(string); int i = 0; while (i < string) { stringBuilder.append(RandomAudioFileName. charAt(random.nextInt(RandomAudioFileName.length()))); i++; } return stringBuilder.toString(); } private void requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == RequestPermissionCode) { if (grantResults.length > 0) { boolean StoragePermission = grantResults[0] == PackageManager.PERMISSION_GRANTED; boolean RecordPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED; if (StoragePermission && RecordPermission) { Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_LONG).show(); } } } } public boolean checkPermission() { int storagePermission = 0; int recordPermission = 0; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { storagePermission = checkSelfPermission(WRITE_EXTERNAL_STORAGE); recordPermission = checkSelfPermission(RECORD_AUDIO); } return storagePermission == PackageManager.PERMISSION_GRANTED && recordPermission == PackageManager.PERMISSION_GRANTED; }}和拍照一样,录音也需要获取权限(注意 Android 6.0 以上还需要动态获取权限),除此之外只需要按照步骤进行录音就可以实现功能了。
mediaplayer相关搜索
-
mac osx
machine_start
macox
magellan
malloc
manifest
manifest文件
map
map 遍历
mapreduce编程
maps google com
margin
margin bottom
margin left
margin right
margin top
marginbottom
marginheight
marginleft
margintop