Android多媒體之VideoView視頻播放器
本文實例為大家分享了視頻播放器的兩種方式,供大家參考,具體內(nèi)容如下
1)、SurfaceView
在布局文件中
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_media_play" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.zking.android_contentresolve.MediaPlayActivity"> <SurfaceView android:layout_width="match_parent" android:layout_height="300dp" android:id="@+id/sv_media_surface" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <SeekBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/seekBar" android:layout_weight="1" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_media_play" android:onClick="isPlayOrPause" /> </LinearLayout> </LinearLayout>
在Activity里面和播放內(nèi)存卡上音樂的代碼差不多,只是視頻多了個顯示內(nèi)容,關(guān)鍵代碼就是這三條
//播放內(nèi)存上的視頻
mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Movies/sister.mp4"));
//準(zhǔn)備(內(nèi)存卡)
mediaPlayer.prepare();
//將媒體播放器捕捉的畫面展示在SurfaceView 上
mediaPlayer.setDisplay(sv_media_surface.getHolder());
但是沒看前面博客的筒子可能會覺得看不懂,所以還是把完整的代碼粘貼出來
public class MediaPlayActivity extends AppCompatActivity {
private SeekBar seekBar;
private MediaPlayer mediaPlayer;
private SurfaceView sv_media_surface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_play);
seekBar = (SeekBar) findViewById(R.id.seekBar);
sv_media_surface = (SurfaceView) findViewById(R.id.sv_media_surface);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//獲取拖動結(jié)束后的位置
int progress=seekBar.getProgress();
//跳轉(zhuǎn)到某個位置播放
mediaPlayer.seekTo(progress);
}
});
}
public void isPlayOrPause(View view){
final ImageButton imageButton= (ImageButton) view;
if(mediaPlayer==null){//代表第一次播放音樂
//播放內(nèi)存卡內(nèi)的音頻
mediaPlayer=new MediaPlayer();
//設(shè)置類型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//設(shè)置音源
try {
//播放內(nèi)存上的視頻
mediaPlayer.setDataSource(this, Uri.parse("file://mnt/sdcard/Movies/sister.mp4"));
//準(zhǔn)備(內(nèi)存卡)
mediaPlayer.prepare();
//將媒體播放器捕捉的畫面展示在SurfaceView 上
mediaPlayer.setDisplay(sv_media_surface.getHolder());
//必須在播放前加載音頻文件(異步準(zhǔn)備)
// mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
//把圖標(biāo)改成暫停的圖標(biāo)(這里的暫停圖標(biāo)就是播放時的狀態(tài))
imageButton.setImageResource(android.R.drawable.ic_media_pause);
//獲取音樂的總時長
int duration=mediaPlayer.getDuration();
//設(shè)置進(jìn)度條的最大值為音樂的總時長
seekBar.setMax(duration);
new MyThread();
}else if(mediaPlayer.isPlaying()){//正在播放音樂
mediaPlayer.pause();
//把圖標(biāo)改成播放的圖標(biāo)(暫停狀態(tài))
imageButton.setImageResource(android.R.drawable.ic_media_play);
}else{
mediaPlayer.start();
imageButton.setImageResource(android.R.drawable.ic_media_pause);
}
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
while(seekBar.getProgress()<seekBar.getMax()){
//獲取當(dāng)前音樂播放的位置
int currentPosition=mediaPlayer.getCurrentPosition();
//讓進(jìn)度條跟著時間走
seekBar.setProgress(currentPosition);
}
}
}
}

2)、VideoView,如果在項目中,僅僅只是播放視頻的話,這種方式會比較簡單,但是如果是要做視頻播放器的話,還是使用第一種方法
布局文件
<VideoView android:layout_width="match_parent" android:layout_height="300dp" android:id="@+id/vv_main_vedio" />
Activity
public class VedioActivity extends AppCompatActivity {
private VideoView vv_main_vedio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vedio);
vv_main_vedio = (VideoView) findViewById(R.id.vv_main_vedio);
//給videoView設(shè)置播放來源
vv_main_vedio.setVideoPath("file://mnt/sdcard/Movies/sister.mp4");
//實例化媒體控制器
MediaController mediaController=new MediaController(this);
//給activity_vedio設(shè)置控制器
vv_main_vedio.setMediaController(mediaController);
mediaController.setMediaPlayer(vv_main_vedio);
}
}

VideoView通過與MediaController類結(jié)合使用,開發(fā)者可以不用自己控制播放與暫停。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android UniversalVideoView實現(xiàn)視頻播放器
- Android音視頻開發(fā)之VideoView使用指南
- Android自定義videoview仿抖音界面
- Android原生視頻播放VideoView的使用
- android多媒體類VideoView使用方法詳解
- Android編程實現(xiàn)VideoView循環(huán)播放功能的方法
- Android VideoView類實例講解
- Android使用VideoView播放本地視頻和網(wǎng)絡(luò)視頻的方法
- android使用videoview播放視頻
- Android中VideoView音視頻開發(fā)的實現(xiàn)
相關(guān)文章
Android Studio 3.6中新的視圖綁定工具ViewBinding 用法詳解
這篇文章主要介紹了Android Studio 3.6中新的視圖綁定工具ViewBinding 用法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
android studio編譯jar包或者aar包的方法教程詳解
這篇文章主要介紹了android studio編譯jar包或者aar包的方法教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
android中ViewPager結(jié)合Fragment進(jìn)行無限滑動
本篇文章中主要介紹了android中ViewPager結(jié)合Fragment進(jìn)行無限滑動,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03
c++ mk文件出錯Jni調(diào)用產(chǎn)生java.lang.UnsatisfiedLinkError錯誤解決方法
錯誤產(chǎn)生在我把方法從c語言轉(zhuǎn)為c++語言后產(chǎn)生的,后來檢查到這種錯誤是因為mk文件出錯,加載c文件和加載c++的文件所用的代碼不一樣,下面請看2013-11-11
Flutter banner_view 輪播圖的使用及實現(xiàn)代碼
這篇文章主要介紹了Flutter banner_view 輪播圖的使用及實現(xiàn)代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07

