android播放器实现
① android实现音乐播放器:在菜单下怎么实现单曲循环,顺序播放,随机播
单曲循环就在当前Activity中重新调用你初始化播放的的代码就可以了顺序播放就是直接获取你歌曲的List下一个position就可以了随机播放就用Random这个类,播放这个类随机生成的一个数就可以了
② 安卓视频播放(阿里云视频点播播放器SDK+SurfaceView)
本篇文章讲述使用阿里云视频视频播放sdk中的高级播放器加上SurfaceView实现,采用id+STS方法进行视频播放。
流程:用户App获取STS凭证 -> 服务端下发STS凭证 -> 用户上传视频并获取vid -> 服务端获取STS凭证 -> 将STS凭证下发给客户端 -> 完成视频播放。
请看阿里云文档=========》》》》》》 阿里云-高级播放器Android使用说明
接下来我们来看一下安卓给我们提供的手势控制类
接口
setOnTouchListener(this);
其中定义了四种状态 NONE = 0, VOLUME = 1, BRIGHTNESS = 2, FF_REW = 3;
接下来我们来看一下我们自定义的SurfaceViewOnGestureListener继承 GestureDetector.SimpleOnGestureListener主要用到了
onDown(MotionEvent e)
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)两个方法
a.在onDown的时候把状态设置NONE
b.判断横向滑动的距离大于纵向滑动的距离,就把模式赋值为快进和后退
c.在onScroll中进行状态赋值,根据滑动的距离,如果按下的点在屏幕的左半部分就吧状态设置为调节亮度BRIGHTNESS,如果在右半部分就是调节音量
d.各种情况调用各自的接口方法
快进和后退,我们需要知道的就是我们滑动的距离如何与视频的长度关联起来。
那么咱们就可以把视频的总长度与屏幕的总长度相比,这样就能知道你手指滑动的距离占视频的多少了。
我们可以通过 l = ration / mySurfaceView.getWidth();来获得这个比例,然后用当前的进度加上指滑动的距离占视频的长度就是要播放的视频位置
抬起点的x坐标与按下点的X坐标所得的距离,大于0是快进,小于零是后退。
系统的音量有很多,包括通话音量值,系统铃声值,音乐音量值,闹铃音量值,等等吧。
做一下笔记以备以后用到
视频播放我们用的是音乐音量值,同样的道理,我们需要把音量和高度进行关联,我们可以控件的高度闭上最大音量得出比例后就可以知道你滑动的距离占音量的多少了。
这里有个注意点就是activity是当前的这个界面,设置的是当前的界面,离开这个界面后就不管用了。
相同的道理和滑动调节音量一样也是获得屏幕的高度比上最大的亮度,然后计算滑动的距离转换成亮度是多少。(这里不多讲了)
为什么会出现黑屏,就是按Home键再点App回来后,只有声音没有图片的问题,因为我们用的是SurfaceView,每次点击Home键时会销毁这个SurfaceView,再回来时又会重新创建,这样我们的阿里云播放器与SurfaceView就没有绑定了,画面就没有了。
这样我们需要 给surfaceView添加mySurfaceView.getHolder().addCallback(this);
我们在按home键的时候会走surfaceDestroyed。这样,我们就可以在这里做一个标识,让他暂停,然后再回来的时候就会走surfaceCreated,判断标识,然后进行处理就可以了。切记一定要重新让aliyunVodPlayer与SurfaceView进行关联,这样才能有画面也有声音。
由于我们的视频在阿里云的服务器上存着,访问阿里云的服务器需要临时凭证,我们通过STS来获取Token,但是这个Token是有时间限制,正好阿里云的播放器给我们提供了播放视频出错时候的回调接口,我们只需要在这里面进行重新请求Token就可以了
③ android 如何实现音乐播放
在Android平台下,要实现声音的播放是十分容易实现的,只要生成一个MediaPlayer对象,并调用它的相关方法,就能改变对声音播放进行控制。MediaPlayer对象有一下各种状态:
熟悉了MediaPlayer对象的各种状态后以及转换条件,就能很好的控制媒体播放。
例如:播放res/raw文件夹中的歌曲十分简单,只需写如下代码:
MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);
mp.start();
也可以指定音乐文件的位置来进行播放,例如,在sdcard根目录下有有一首歌曲:test.mp3。则可以这样播放:
MediaPlayer mp = new MediaPlayer();
String song = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.mp3";
try {
mp.setDataSource(song);
mp.prepare();
mp.start();
} catch (Exception e) {
e.printStackTrace();
}
建议在播放音乐的时候把MediaPlayer放在Service中,因为如果放在Activity中会使得界面特别卡。而且音乐不能放到后台里播放,一旦退出Activity,音乐就会暂停播放。
可以在Activity中布局相关的界面,例如按钮等。然后通过这个Activitiy来启动这个Service。要通过UI与Service交互,可以通过Intent对象传递消息。更复杂一些,要实现Service向Activity发送消息,并利用这些消息来更新UI,这可以用广播机制,例如告诉Activity是否正在播放,播放进度,当前播放歌曲条目等信息。
例如以下实例代码:
/*Activity中*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnPlay = (Button)findViewById(R.id.btnPlay);
btnPause = (Button)findViewById(R.id.btnPause);
btnPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SoundService.class);
intent.putExtra("playing", true);
startService(intent);
}
});
btnPause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SoundService.class);
intent.putExtra("playing", false);
startService(intent);
}
});
}
}
播放音乐的Service代码:
package com.yzy.sound;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class SoundService extends Service {
private MediaPlayer mp;
@Override
public void onCreate() {
super.onCreate();
mp = MediaPlayer.create(this, R.raw.test);
}
@Override
public void onDestroy() {
super.onDestroy();
mp.release();
stopSelf();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
boolean playing = intent.getBooleanExtra("playing", false);
if (playing) {
mp.start();
} else {
mp.pause();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
④ Android实现视频播放的几种方式
Android提供了常见的视频编码,解码机制,使用Android自带的MediaPlayer,MediaController等类可以很方便的实现视频播放的功能。支持的视频格式有MP4和3GP等。这些多媒体数据可以来自于Android应用的资源文件,也可以来自于外部存储器上的文件,甚至可以是来自于网络上的文件流。
1、MediaController+VideoView实现方式
这种方式是最简单的实现方式。VideoView继承了SurfaceView同时实现了MediaPlayerControl接口,MediaController则是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件。通过VideoView+MediaController可以很轻松的实现视频播放、停止、快进、快退等功能。
布局文件如下:
使用此实现方式的步骤:
1.加载指定的视频文件
2.建立VideoView和MediaController之间的关联,这样就不需要自己去控制视频的播放、暂停等。让MediaController控制即可。
3.VideoView获取焦点。
2、MediaPlayer+SurfaceView+自定义控制器
虽然VideoView的实现方式很简单,但是由于是自带的封装好的类,所以无论是播放器的大小、位置以及控制都不受我们控制。
这种实现方式步骤如下:
1.创建MediaPlayer对象,并让它加载指定的视频文件。可以是应用的资源文件、本地文件路径、或者URL。
2.在界面布局文件中定义SurfaceView组件,并为SurfaceView的SurfaceHolder添加Callback监听器。
3.调用MediaPlayer对象的setDisplay(SurfaceHolder sh)将所播放的视频图像输出到指定的SurfaceView组件。
4.调用MediaPlayer对象的prepareAsync()或prepare()方法装载流媒体文件
5.调用MediaPlayer对象的start()、stop()和pause()方法来控制视频的播放。
在实现第二步之前需要先给surfaceHolder设置一个callback,callback的3个回调函数如下:
3、MediaPlayer+SurfaceView+MediaController
第二种实现方式使用的是自定义控件,MediaPlayer+SurfaceView也可以使用系统自带的MediaController控制器。
使用这个方式实现,布局文件只需一个SurfaceView即可,其他的控件都交给MediaController控制器,布局文件如下:
实际过程中推荐大家使用B站的播放器ijkplayer非常好用!
⑤ 怎么利用ffmpeg实现android播放器
下面把具体编译步骤描述如下,假定NDK安装在~/android-ndk-r7:
1. 首先从FFmpeg官网下载最新的release版本源码ffmpeg-0.11.tar.gz解压缩到Android源码树的ffmpeg/下。
2 准备一个编译脚本build_android.sh并放在ffmpeg/下面,这个脚本也是Rockplayer提供的,需做一些修改,其内容附在后面。我目前用的也会附在后面。
3 在ffmpeg目录下运行./build_android.sh开始编译FFmpeg,编译好的libffmpeg.so会放在文件夹android里面,一共有3个版本分别对应3种ARM体系结构,包括armv7-a、armv7-a-vfp、armv6_vfp,根据所运行的硬件平台选取其中一个版本。为了编译使用FFmpeg的程序时可以方便地找到libffmpeg.so,可将它复制到$OUT/system/lib/和$OUT/obj/lib/,当然这一步也可以加在build_android.sh中做。
4. 接下来就是编译可执行文件ffmpeg了,这个工具可以在命令行下完成FFmpeg提供的几乎所有功能包括编码、解码、转码等,也是用来调试和验证很有用的工具。其实上述编译完后在$ANDROID_BUILD_TOP/external/ffmpeg/下也会生成ffmpeg,但是在设备上无法运行。为了编出能在设备上运行的ffmpeg,可以写一个简单的Android.mk,
⑥ 安卓手机系统升级后如何实现多个播放软件同时播放
1、在手机桌面找到设置并点击打开。
2、进入设置后,找到播放软件应用并点击。
3、在播放软件应用中点击应用分身。
4、将需要的播放软件分身按钮置于打开状态。
5、返回界面可以实现多个播放软件同时运行。