本文實(shí)例講述了Android編程視頻播放API之MediaPlayer用法。分享給大家供大家參考,具體如下:

在南海等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),南海網(wǎng)站建設(shè)費(fèi)用合理。
現(xiàn)在項(xiàng)目要做音視頻這塊功能,這正是我相對(duì)比較薄弱的地方,項(xiàng)目中要用到,趕緊抓緊時(shí)間學(xué)習(xí)。前面有一編介紹不錯(cuò)的文章https://www.jb51.net/article/121881.htm,值得學(xué)習(xí)。
這里給出一個(gè)較為簡(jiǎn)單的示例:
/**
* Android API MediaPlayer示例
*
* @description:
* @author ldm
* @date 2016-4-20 上午10:42:06
*/
public class MediaPlayerActivity extends Activity implements OnClickListener {
private Button mlocalvideo;
private Button mstreamvideo;
private Button mlocalaudio;
private Button mresourcesaudio;
private static final String MEDIA = "media";
private static final int LOCAL_AUDIO = 1;
private static final int RESOURCES_AUDIO = 3;
private static final int STREAM_VIDEO = 5;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_mediaplayer);
initViewsAndEvents();
}
private void initViewsAndEvents() {
mlocalaudio = (Button) findViewById(R.id.localaudio);
mresourcesaudio = (Button) findViewById(R.id.resourcesaudio);
mlocalvideo = (Button) findViewById(R.id.localvideo);
mstreamvideo = (Button) findViewById(R.id.streamvideo);
mlocalaudio.setOnClickListener(this);
mresourcesaudio.setOnClickListener(this);
mlocalvideo.setOnClickListener(this);
mstreamvideo.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.localaudio:
case R.id.localvideo:
Intent intent = new Intent(MediaPlayerActivity.this.getApplication(),
MediaPlayerDemo_Audio.class);
intent.putExtra(MEDIA, LOCAL_AUDIO);
startActivity(intent);
break;
case R.id.resourcesaudio:
Intent resIn = new Intent(MediaPlayerActivity.this.getApplication(),
MediaPlayerDemo_Audio.class);
resIn.putExtra(MEDIA, RESOURCES_AUDIO);
startActivity(resIn);
break;
case R.id.streamvideo:
Intent streamIn = new Intent(MediaPlayerActivity.this,
MediaPlayerDemo_Video.class);
streamIn.putExtra(MEDIA, STREAM_VIDEO);
startActivity(streamIn);
break;
}
}
}
/**
* OnBufferingUpdateListener可以獲取視頻音頻流的緩沖狀態(tài);
* OnCompletionListener播放完畢監(jiān)聽(tīng)器
* OnPreparedListener準(zhǔn)備播放相關(guān)接口
* OnVideoSizeChangedListener注冊(cè)視頻大小改變監(jiān)聽(tīng)器
* SurfaceHolder.Callback:SurfaceView監(jiān)聽(tīng)callback
* @description:
* @author ldm
* @date 2016-4-20 上午9:46:16
*/
public class MediaPlayer_Video extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
private static final String TAG = "MediaPlayerDemo";
//Video寬度
private int mVideoWidth;
//Video高度
private int mVideoHeight;
//播放器MediaPlayer
private MediaPlayer mMediaPlayer;
//播放界面SurfaceView
private SurfaceView mPreview;
//媒體播放器的載體 SurfaceHolder
private SurfaceHolder holder;
//文件路徑
private String path;
//Bundle數(shù)據(jù)對(duì)象
private Bundle extras;
private static final String MEDIA = "media";
private static final int LOCAL_VIDEO = 1;
private static final int RESOURCES_AUDIO = 3;
private static final int STREAM_VIDEO = 5;
private boolean mIsVideoSizeKnown = false;
private boolean mIsVideoReadyToBePlayed = false;
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
//高版本上已經(jīng)不推薦使用了 ,如果要兼容低版本(如Android 2.3或以下版本)要加上這段代碼,不然播放時(shí) 只會(huì)有聲音 沒(méi)有圖像。
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
extras = getIntent().getExtras();
}
private void playVideo(Integer Media) {
doCleanUp();
try {
switch (Media) {
case LOCAL_VIDEO://本地文件(如SD卡)
/*
* TODO:將路徑變量設(shè)置為本地媒體文件路徑。
*/
path = "";//這里要填寫(xiě)你所播放音視頻的文件路徑
if (path == "") {
Toast
.makeText(
MediaPlayer_Video.this,
"Please edit MediaPlayerDemo_Video Activity, "
+ "and set the path variable to your media file path."
+ " Your media file must be stored on sdcard.",
Toast.LENGTH_LONG).show();
}
break;
case STREAM_VIDEO://流文件
/**
* 路徑變量設(shè)置為mp4或3gpp格式的URL。應(yīng)該使用Http協(xié)議。
* 媒體播放器只能通過(guò)流的形式獲取數(shù)據(jù),所以需要:
* 1。必須是媒體流數(shù)據(jù)。
* 2。必須合理剪輯。
*/
path = "";
if (path == "") {
// Tell the user to provide a media file URL.
Toast
.makeText(
MediaPlayer_Video.this,
"Please edit MediaPlayerDemo_Video Activity,"
+ " and set the path variable to your media file URL.",
Toast.LENGTH_LONG).show();
}
break;
case RESOURCES_AUDIO:
//播放放在諸如res/raw文件夾下的資源文件
//直接通過(guò)mMediaPlayer = MediaPlayer.create(this, R.raw.test_cbr);
//可以參考API Demos中AudioFxDemo類(lèi)文件
break;
}
// 創(chuàng)建MediaPlayer對(duì)象,傳入文件數(shù)據(jù)并設(shè)備監(jiān)聽(tīng)
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
//使用 create() 方法創(chuàng)建的 MediaPlayer, 直接指定了 媒體資源, 不需要再進(jìn)行 調(diào)用 prepare() 方法;
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
//指定音頻流類(lèi)型
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
}
}
public void onBufferingUpdate(MediaPlayer arg0, int percent) {
Log.d(TAG, "onBufferingUpdate percent:" + percent);
}
public void onCompletion(MediaPlayer arg0) {
Log.d(TAG, "onCompletion called");
}
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
Log.v(TAG, "onVideoSizeChanged called");
if (width == 0 || height == 0) {
Log.e(TAG, "invalid video width(" + width + ") or height(" + height + ")");
return;
}
mIsVideoSizeKnown = true;
mVideoWidth = width;
mVideoHeight = height;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}
public void onPrepared(MediaPlayer mediaplayer) {
Log.d(TAG, "onPrepared called");
mIsVideoReadyToBePlayed = true;
if (mIsVideoReadyToBePlayed && mIsVideoSizeKnown) {
startVideoPlayback();
}
}
public void surfaceChanged(SurfaceHolder surfaceholder, int i, int j, int k) {
Log.d(TAG, "surfaceChanged called");
}
public void surfaceDestroyed(SurfaceHolder surfaceholder) {
Log.d(TAG, "surfaceDestroyed called");
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "surfaceCreated called");
playVideo(extras.getInt(MEDIA));
}
@Override
protected void onPause() {
super.onPause();
releaseMediaPlayer();
doCleanUp();
}
@Override
protected void onDestroy() {
super.onDestroy();
releaseMediaPlayer();
doCleanUp();
}
private void releaseMediaPlayer() {
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
private void doCleanUp() {
mVideoWidth = 0;
mVideoHeight = 0;
mIsVideoReadyToBePlayed = false;
mIsVideoSizeKnown = false;
}
private void startVideoPlayback() {
Log.v(TAG, "startVideoPlayback");
holder.setFixedSize(mVideoWidth, mVideoHeight);
mMediaPlayer.start();
}
}
布局文件activity_mediaplayer
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button android:id="@+id/localvideo"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/local_video"
/>
<Button android:id="@+id/streamvideo"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/stream_video"
/>
<Button android:id="@+id/localaudio"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/local_audio"
/>
<Button android:id="@+id/resourcesaudio"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/res_audio"
/>
</LinearLayout>
布局文件activity_mediaplayer_video
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView android:id="@+id/surface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
</SurfaceView>
</LinearLayout>
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
本文題目:Android編程視頻播放API之MediaPlayer用法示例
文章起源:http://chinadenli.net/article38/gesisp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、搜索引擎優(yōu)化、動(dòng)態(tài)網(wǎng)站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)