android之多媒体篇(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Android 4.0.3(Api Level 15)支持的多媒体格式。

注意:有些设备可能支持其他的文件格式。

1.Audio

AAC LC/LTP、HE-AACv1(AAC+)、AMR-NB、AMR-WB、MP3、MIDI、Ogg Vorbis、PCM/WAVE、FLAC(3.1或3.1以上)

2.Image

JPEG、PNG、WEBP、GIF、BMP

3.Video

H.263、H.264 AVC、MPEG-4 SP、VP8(2.3.3或2.3.3以上)

播放音频、视频主要由MediaPlayer类来控制。

大致步骤:
1.初始化MediaPlayer,附上要播放的媒体。

2.准备播放 prepare

3.开始播放 start

4.在播放结束前:停止或者暂停播放 pause or stop

5.播放完成 complete

android只支持有限数量的可同步的MediaPlayer,不释放它们会导致运行时错误,所以当你完成播放的时候,记得:

mediaPlayer.release(); 来释放所涉及的资源。

Prepare音频

MediaPlayer可以播放本地文件、Content Providers、远程URL流。

加载:

// Load an audio resource from a package resource. 
MediaPlayer resourcePlayer = MediaPlayer.create(this, R.raw.my_audio);// Load an audio resource from a local file. 
MediaPlayer filePlayer = MediaPlayer.create(this, Uri.parse(“file:///sdcard/localfile.mp3”));// Load an audio resource from an online resource. 
MediaPlayer urlPlayer = MediaPlayer.create(this, Uri.parse(“http://site.com/audio/audio.mp3”));// Load an audio resource from a Content Provider. 
MediaPlayer contentPlayer = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);

注意:上述这种create后返回mediaPlayer的方式,其实已经调用了prepare方法,所以不能再调用了。

涉及网络的,记得加网络权限。

方法2:

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(“/sdcard/mydopetunes.mp3”);
mediaPlayer.prepare();

与上面类似。

Prepare视频

想要播放视频,比播放音频复杂许多。播放视频你必须有一个surface来支持。

2种方式来播放视频:

方法一:使用VideoView,内置了surface,通过MediaPlayer加载。

方法二:自己指定surface,直接操作底层的MediaPlayer。

播放视频通过VideoView:

final VideoView videoView = (VideoView)findViewById(R.id.videoView);// Assign a local file to play 
videoView.setVideoPath(“/sdcard/mycatvideo.3gp”);// Assign a URL of a remote video stream 
videoView.setVideoUri(myAwesomeStreamingSource);

当Video被初始化后,你可以控制它的播放通过使用start、stopPlayback、pause、seekTo方法。

VideoView还包含setKeepScreenOn方法,在播放中屏幕不锁屏。

方法一:使用VideoView:

// Get a reference to the Video View. 
final VideoView videoView = (VideoView)findViewById(R.id.videoView);// Configure the video view and assign a source video. 
videoView.setKeepScreenOn(true); 
videoView.setVideoPath(“/sdcard/mycatvideo.3gp”);// Attach a Media Controller 
MediaController mediaController = new MediaController(this); 
videoView.setMediaController(mediaController);

方法二:利用surface

SurfaceHolder是异步创建的,所以你必须等surfaceCreated触发后,你才能将Holder给mediaPlayer。

直接看框架代码:

public class SurfaceViewVideoViewActivity extends Activity implements SurfaceHolder.Callback {static final String TAG = “SurfaceViewVideoViewActivity”;private MediaPlayer mediaPlayer;public void surfaceCreated(SurfaceHolder holder) { try {  // When the surface is created, assign it as the // display surface and assign and prepare a data // source. mediaPlayer.setDisplay(holder); mediaPlayer.setDataSource(“/sdcard/test2.3gp”); mediaPlayer.prepare(); } catch (IllegalArgumentException e) { Log.e(TAG, “Illegal Argument Exception”, e); } catch (IllegalStateException e) { Log.e(TAG, “Illegal State Exception“, e); } catch (SecurityException e) { Log.e(TAG, “Security Exception“, e); } catch (IOException e) { Log.e(TAG, “IO Exception“, e); } 
}public void surfaceDestroyed(SurfaceHolder holder) { mediaPlayer.release(); 
}public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }@Override 
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.surfaceviewvideoviewer);// Create a new Media Player. mediaPlayer = new MediaPlayer();// Get a reference to the Surface View. final SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView);// Configure the Surface View. surfaceView.setKeepScreenOn(true);// Configure the Surface Holder and register the callback. SurfaceHolder holder = surfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.setFixedSize(400, 300);// Connect a play button. Button playButton = (Button)findViewById(R.id.buttonPlay); playButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.start();} });// Connect a pause button. Button pauseButton = (Button)findViewById(R.id.buttonPause); pauseButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.pause(); } });// Add a skip button. Button skipButton = (Button)findViewById(R.id.buttonSkip); skipButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mediaPlayer.seekTo(mediaPlayer.getDuration()/2); } }); } 
}

控制MediaPlayer的播放

mediaPlayer.start()后就开始播放。 getDuration方法获得播放的长度,getCurrentPosition找到当前播放到的位置。使用seekTo方法跳到指定的位置。

去确保一致的体验,Android提供了MediaController-一个标准的提供常用的Media控制按钮,就像:

image

你若想使用MediaController去控制播放,最好在代码中实例化它。当你这么做了,MediaController只会在你设置它为visible之后或者触摸它的Video View,或者与其交互。

如果你使用VideoView去显示你的视频内容,你可以简单得通过VideoViewsetMediaController方法:

// Attach a Media Controller 
MediaController mediaController = new MediaController(this); 
videoView.setMediaController(mediaController);

去控制一个MediaPlayer,你需要去实现一个新的MediaController.MediaPlayerControl

MediaController mediaController = new MediaController(this); 
mediaController.setMediaPlayer(new MediaPlayerControl() {public boolean canPause() { return true; }public boolean canSeekBackward() { return true; }public boolean canSeekForward() { return true; }public int getBufferPercentage() { return 0; }public int getCurrentPosition() { return mediaPlayer.getCurrentPosition(); }public int getDuration() { return mediaPlayer.getDuration(); }public boolean isPlaying() { return mediaPlayer.isPlaying(); }public void pause() { mediaPlayer.pause(); }public void seekTo(int pos) { mediaPlayer.seekTo(pos); }public void start() { mediaPlayer.start(); }});

使用setAnchorView方法去决定MediaController依附在哪个View上,这个View可以是任意View

调用show或者hide来显示或者隐藏。

mediaController.setAnchorView(myView); 
mediaController.show();

管理MediaPlayer的输出

MediaPlayer提供方法去控制音量、锁屏亮度、设置循环模式

控制音量通过setVolume方法。

mediaPlayer.setVolume(0.5f, 0.5f);  值在0-1之间浮点数,0表示静音,1表示最大音量。 2个参数分别代表左声道和右声道

mediaPlayer.setScreenOnWhilePlaying(true);  //播放时,屏幕不锁屏。if (!mediaPlayer.isLooping()) mediaPlayer.setLooping(true);

有些设备,附上了耳机,或者蓝牙耳机,会提供播放、暂停、skip、上一个播放的 按键

你可以监听Action为:android.intent.action.MEDIA_BUTTON

public class MediaControlReceiver extends BroadcastReceiver {public static final String ACTION_MEDIA_BUTTON = “com.paad.ACTION_MEDIA_BUTTON”;@Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { Intent internalIntent = new Intent(ACTION_MEDIA_BUTTON); internalIntent.putExtras(intent.getExtras()); context.sendBroadcast(internalIntent); } } 
}public class ActivityMediaControlReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (MediaControlReceiver.ACTION_MEDIA_BUTTON.equals( intent.getAction())) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);switch (event.getKeyCode()) { case (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) : if (mediaPlayer.isPlaying()) pause(); else play(); break; case (KeyEvent.KEYCODE_MEDIA_PLAY) : play(); break; case (KeyEvent.KEYCODE_MEDIA_PAUSE) : pause(); break; case (KeyEvent.KEYCODE_MEDIA_NEXT) : skip(); break; case (KeyEvent.KEYCODE_MEDIA_PREVIOUS) :previous(); break; case (KeyEvent.KEYCODE_MEDIA_STOP) : stop(); break; default: break; } } } 
}

AudioManagerregistMediaButtonEventReceiver方法去注册接受者,可以防止其他APP也在监听ACTION

// Register the Media Button Event Receiver to 
// listen for media button presses. 
AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
ComponentName component = new ComponentName(this, MediaControlReceiver.class);am.registerMediaButtonEventReceiver(component);// Register a local Intent Receiver that receives media button 
// presses from the Receiver registered in the manifest. 
activityMediaControlReceiver = new ActivityMediaControlReceiver(); 
IntentFilter filter = new IntentFilter(MediaControlReceiver.ACTION_MEDIA_BUTTON);registerReceiver(activityMediaControlReceiver, filter);

转载于:https://my.oschina.net/wangjunhe/blog/118613

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试题库二级C操作题100套(第77套)

第77套: 给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。 例如,输入一个整数:27638496&#xff0c…

第二章:用户登录管理模块

本章简介 1.项目分层 2.创建MyHibernateSessionFactory 3.设计用户接口和实现类 4.设计所有Action父类 5.设计用户Action类 6.页面调用 7.完成显示登录成功用户名和注销功能 8.显示报错信息 1.项目分层 实体层(模型层):entity包 学生类、用户…

python组合数据分类_Python 数据可视化:分类特征统计图

上一课已经体验到了 Seaborn 相对 Matplotlib 的优势,本课将要介绍的是 Seaborn 对分类数据的统计,也是它的长项。针对分类数据的统计图,可以使用 sns.catplot 绘制,其完整参数如下:seaborn.catplot(xNone, yNone, hue…

MongoDB 主从集群配置

创建必要的目录和认证文件: [rootmongo mongo]# mkdir keyfile [rootmongo mongo]# echo "mongo cluster one" > keyfile/m1[rootmongo mongo]# echo "mongo cluster one" > keyfile/m2[rootmongo mongo]# echo "mongo cluster one&…

linux进程互斥要点,linux进程之间互斥

总所周知,在linux中pthread_mutex_t可以用于同一进程内多个线程之间的同步。我们所需要做的工作,仅仅是定义一个全局的pthread_mutex_t类型变量即可。但是对于进程之间的互斥,就没有那么简单了。我们必须将pthread_mutex_t类型变量放到各个进…

java定时器_拾遗Timer定时器

一 Timer 介绍在开发中我们经常会遇到一些简单定时任务的需求,而不需要量级较重的定时任务就可以采取java定时器;java.util.Timer工具类中的Timer 是定时器,但定时任务写在java.util.TimerTask 中,由 Timer 执行 TimerTask &#…

逻辑门电路的知识点归纳

1.半导体二极管与MOS管的开关特性 二极管:正向导通,反向截止,但是要注意的是从反向截止到正向导通的时间极其短,但是从正向导通到反向截止要经过反向恢复(电荷存储效应)的过程,这个过程实际上就…

全国计算机等级考试题库二级C操作题100套(第78套)

第78套: 给定程序中,函数fun的功能是:将NN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。例如,若N3,有下列矩阵: 1 2 3 4 5 6 7 8 9 交换后为: 3 2 1 4 5 6 9 8 7 请在程序的下划线处…

善心

2019独角兽企业重金招聘Python工程师标准>>> 一个穷苦学生郝武德.凯礼,为了付学费,挨家挨户地推销货品。 到了晚上,发现自己的肚子很饿,而口袋里只剩下一个小钱。他在大街上犹豫徘徊了半天,终于鼓起勇气&a…

linux权限sudo和su,Linux su和sudo命令的区别,并获得root权限

su(superuser)su表示切换用户,如: 输入:su命令后回车表示切换当前的用户到root用户,或者: 输入:su - root(或者其他用户名)这里加了"-"后表示也切换的当前的环境变量到新用户的环境变量。su root…

python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路

一、Python 已来 AI 不远在当今,人工智能已经渗透到了智能手机、网络搜索,广告分发,人脸识别,语音识别,自动驾驶,智能医疗,无人银行等日常生活领域。人工智能的生活化是不可避免的,它…

软件测试 决策表

决策表技术使用的一下特征的应用 If then else 逻辑关系 输入变量之间存在逻辑关系 计算过程中涉及对输入变量子集的处理 输入与输出之间存在因果关系 圈复杂度较高 决策表规模的增长方式不高(有N个条件的有限项决策表有2^N条规则),有几种方法…

js判断用户是否离开当前页面

简介 VisibilityChange 事件;用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender,visible 和 hidden let pageVisibility document.visibilityState; // 监听 visibility change 事件 document.addEventLi…

全国计算机等级考试题库二级C操作题100套(第79套)

第79套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回&#xff0c;并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并把…

linux 交叉编译 静态库,在ARM交叉编译时,如何选择要链接的静态库?

小编典典您有两种选择&#xff0c;获取正确的编译器。编写自己的“ C”库。获取正确的编译器。你是 总是 最安全的有一个编译器匹配您的系统。这适用于x86Linux和各种发行版。如果不同的编译器可以工作&#xff0c;您将很幸运。当您交叉编译时&#xff0c;这样做会更加困难&…

python输出可执行文件_重定向-禁止在Python调用中输出可执行文件

重定向-禁止在Python调用中输出可执行文件我有一个名为B的二进制文件&#xff0c;该文件在调用时会生成输出。 如果从Bash shell调用它&#xff0c;则大多数输出将受到A > /dev/null的抑制。所有输出将受到A &> /dev/null的抑制我有一个名为B的Python脚本&#xff0c…

全国计算机等级考试题库二级C操作题100套(第80套)

第80套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将形参n中&#xff0c;各位上为偶数的数取出&#xff0c;并按原来从高位到低位的顺序组成一个新的数&#xff0c;并作为函数值返回。 例如&#xff0c;从主函数输入一个整数&#xff1a;27638496&#x…

记一次B站答题经历

第一题部分&#xff1a;社区规范卷 --------- ------------ 第二题&#xff1a;社区规范第二部分 -------------------- 第三部分自由选择题 ---------------------- -------------------------------- 最后答题成绩得分 -------------- ------------- 答完题后的感受&#xff…

linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...

Linux在安装软件的时候有时会出现错误&#xff0c;提示缺少动态链接库.so&#xff0c;该问题是由什么原因导致的呢?情况分析&#xff1a;1.缺少动态连接库.so-cannot open shared object file:No such file or directory2.缺少动态连接库.so.0-cannot open shared object file…

全国计算机等级考试题库二级C操作题100套(第81套)

第81套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在形参s所指字符串中的每个数字字符之后插入一个号。例如&#xff0c;形参s所指的字符串为&#xff1a;def35adh3kjsdf7。执行结果为&#xff1a;def35adh3kjsdf7*。 请在程序的下划线处填入正确的内容并…