本講內(nèi)容:Android中的音頻和視頻使用入門指南
Android 提供了 MediaPlayer 和 MediaRecorder 兩個工具類,,來幫助開發(fā)者操作音頻和視頻。我們通過兩個小例子來學習一下多媒體資源的使用。
一,、 簡單音樂播放器
1,、新建一個項目Lesson28_Music , 主Activity的名字是 MainMusic.java
2、拷貝 這幾張圖片到res/drawable目錄下,,并建立3個xml文件,,拷貝love.mp3到res/raw文件中。
play.xml
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< selector xmlns:android = "http://schemas./apk/res/android" > |
3 |
< item android:state_enabled = "false" android:drawable = "@drawable/play_disable" > <!-- state_enabled=false --> |
4 |
< item android:drawable = "@drawable/play_50" > <!-- default --> |
5 |
</ item ></ item ></ selector > |
pause.xml
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< selector xmlns:android = "http://schemas./apk/res/android" > |
3 |
< item android:state_enabled = "false" android:drawable = "@drawable/pause_disable" > <!-- state_enabled=false --> |
4 |
< item android:drawable = "@drawable/pause_50" > <!-- default --> |
5 |
</ item ></ item ></ selector > |
stop.xml
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< selector xmlns:android = "http://schemas./apk/res/android" > |
3 |
< item android:state_enabled = "false" android:drawable = "@drawable/stop_disable" > <!-- state_enabled=false --> |
4 |
< item android:drawable = "@drawable/stop_50" > <!-- default --> |
5 |
</ item ></ item ></ selector > |
3,、res/layout/main.xml 的內(nèi)容如下:
01 |
<? xml version = "1.0" encoding = "utf-8" ?> |
02 |
< linearlayout xmlns:android = "http://schemas./apk/res/android" android:layout_height = "fill_parent" android:layout_width = "fill_parent" android:orientation = "vertical" > |
03 |
< textview android:layout_height = "wrap_content" android:layout_width = "fill_parent" android:text = "簡單音樂播放器" android:textsize = "25sp" > |
04 |
</ textview > |
05 |
< linearlayout xmlns:android = "http://schemas./apk/res/android" android:layout_height = "fill_parent" android:layout_width = "fill_parent" android:orientation = "horizontal" > |
06 |
07 |
< imagebutton android:background = "@drawable/play" android:layout_height = "wrap_content" android:layout_width = "wrap_content" android:id = "@+id/play" android:adjustviewbounds = "true" android:layout_margin = "4dp" > |
08 |
</ imagebutton > |
09 |
10 |
< imagebutton android:background = "@drawable/pause" android:layout_height = "wrap_content" android:layout_width = "wrap_content" android:id = "@+id/pause" android:adjustviewbounds = "true" android:layout_margin = "4dp" > |
11 |
</ imagebutton > |
12 |
13 |
< imagebutton android:background = "@drawable/stop" android:layout_height = "wrap_content" android:layout_width = "wrap_content" android:id = "@+id/stop" android:adjustviewbounds = "true" android:layout_margin = "4dp" > |
14 |
</ imagebutton > |
15 |
</ linearlayout > |
16 |
</ linearlayout > |
4,、MainMusic.java的內(nèi)容如下:
001 |
package android.basic.lesson28; |
002 |
003 |
import java.io.IOException; |
004 |
005 |
import android.app.Activity; |
006 |
import android.media.MediaPlayer; |
007 |
import android.media.MediaPlayer.OnCompletionListener; |
008 |
import android.media.MediaPlayer.OnPreparedListener; |
009 |
import android.os.Bundle; |
010 |
import android.view.View; |
011 |
import android.view.View.OnClickListener; |
012 |
import android.widget.ImageButton; |
013 |
import android.widget.Toast; |
014 |
015 |
public class MainMusic extends Activity { |
016 |
017 |
// 聲明變量 |
018 |
private ImageButton play, pause, stop; |
019 |
private MediaPlayer mPlayer; |
020 |
021 |
/** Called when the activity is first created. */ |
022 |
@Override |
023 |
public void onCreate(Bundle savedInstanceState) { |
024 |
super .onCreate(savedInstanceState); |
025 |
setContentView(R.layout.main); |
026 |
027 |
// 定義UI組件 |
028 |
play = (ImageButton) findViewById(R.id.play); |
029 |
pause = (ImageButton) findViewById(R.id.pause); |
030 |
stop = (ImageButton) findViewById(R.id.stop); |
031 |
032 |
// 按鈕先全部失效 |
033 |
play.setEnabled( false ); |
034 |
pause.setEnabled( false ); |
035 |
stop.setEnabled( false ); |
036 |
037 |
// 定義單擊監(jiān)聽器 |
038 |
OnClickListener ocl = new View.OnClickListener() { |
039 |
040 |
@Override |
041 |
public void onClick(View v) { |
042 |
switch (v.getId()) { |
043 |
case R.id.play: |
044 |
// 播放 |
045 |
Toast.makeText(MainMusic. this , "點擊播放" , Toast.LENGTH_SHORT) |
046 |
.show(); |
047 |
play(); |
048 |
break ; |
049 |
case R.id.pause: |
050 |
// 暫停 |
051 |
Toast.makeText(MainMusic. this , "暫停播放" , Toast.LENGTH_SHORT) |
052 |
.show(); |
053 |
pause(); |
054 |
break ; |
055 |
case R.id.stop: |
056 |
// 停止 |
057 |
Toast.makeText(MainMusic. this , "停止播放" , Toast.LENGTH_SHORT) |
058 |
.show(); |
059 |
stop(); |
060 |
break ; |
061 |
} |
062 |
} |
063 |
}; |
064 |
065 |
// 綁定單擊監(jiān)聽 |
066 |
play.setOnClickListener(ocl); |
067 |
pause.setOnClickListener(ocl); |
068 |
stop.setOnClickListener(ocl); |
069 |
070 |
// 初始化 |
071 |
initMediaPlayer(); |
072 |
} |
073 |
074 |
// 初始化播放器 |
075 |
private void initMediaPlayer() { |
076 |
077 |
// 定義播放器 |
078 |
mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.love); |
079 |
080 |
// 定義資源準備好的監(jiān)聽器 |
081 |
mPlayer.setOnPreparedListener( new OnPreparedListener() { |
082 |
@Override |
083 |
public void onPrepared(MediaPlayer mp) { |
084 |
// 資源準備好了再讓播放器按鈕有效 |
085 |
Toast.makeText(MainMusic. this , "onPrepared" , Toast.LENGTH_SHORT) |
086 |
.show(); |
087 |
play.setEnabled( true ); |
088 |
} |
089 |
}); |
090 |
091 |
// 定義播放完成監(jiān)聽器 |
092 |
mPlayer.setOnCompletionListener( new OnCompletionListener() { |
093 |
094 |
@Override |
095 |
public void onCompletion(MediaPlayer mp) { |
096 |
Toast.makeText(MainMusic. this , "onCompletion" , |
097 |
Toast.LENGTH_SHORT).show(); |
098 |
stop(); |
099 |
} |
100 |
}); |
101 |
} |
102 |
103 |
// 停止播放 |
104 |
private void stop() { |
105 |
mPlayer.stop(); |
106 |
pause.setEnabled( false ); |
107 |
stop.setEnabled( false ); |
108 |
try { |
109 |
mPlayer.prepare(); |
110 |
mPlayer.seekTo( 0 ); |
111 |
play.setEnabled( true ); |
112 |
} catch (IllegalStateException e) { |
113 |
e.printStackTrace(); |
114 |
} catch (IOException e) { |
115 |
e.printStackTrace(); |
116 |
} |
117 |
118 |
} |
119 |
120 |
// 播放 |
121 |
private void play() { |
122 |
123 |
mPlayer.start(); |
124 |
play.setEnabled( false ); |
125 |
pause.setEnabled( true ); |
126 |
stop.setEnabled( true ); |
127 |
} |
128 |
129 |
// 暫停 |
130 |
private void pause() { |
131 |
mPlayer.pause(); |
132 |
play.setEnabled( true ); |
133 |
pause.setEnabled( false ); |
134 |
stop.setEnabled( true ); |
135 |
} |
136 |
137 |
// Activity銷毀前停止播放 |
138 |
@Override |
139 |
protected void onDestroy() { |
140 |
super .onDestroy(); |
141 |
if (stop.isEnabled()) { |
142 |
stop(); |
143 |
} |
144 |
145 |
} |
146 |
147 |
} |
5、運行程序,,查看效果
二,、簡單視頻播放器
Android為視頻播放提供了VideoView 和 MediaController 兩個現(xiàn)成的組件,讓我們可以方便的實現(xiàn)MP4、3GP等視頻的播放,。下面我們通過一個例子來看一下:
1,、新建一個項目 Lesson28_Video
2、使用 Format Factory 這個軟件壓縮一個視頻備用,,我這里壓縮的參數(shù)如下:
注意,,如果播放時完全無法播放或者只有聲音沒有圖像,你就需要換壓縮軟件和調整壓縮參數(shù)重新壓縮視頻了,,暫時只能這樣,,我也是折騰了2-3小時都是 黑屏,郁悶中(似乎得出一個答案,,是否黑屏和機器設備的性能有關,,我降低壓縮分辨率和每秒幀數(shù),出圖像音畫同步,,如果提高每秒幀數(shù),,聲音出來后十幾秒圖像 才會出來,但是出來后音畫還是同步的,,有興趣的朋友可以多測試測試給出一個結論),。
用命令行的方式拷貝此視頻到存儲卡(sdcard)中,為什么不用eclipse中的可視化工具拷貝呢,?因為那個方式靠大文件的時候經(jīng)常失敗,,而命令行方式我沒拷貝失敗一次過。命令就是 adb push ,,具體截個圖給你看:
3,、res\layout\main.xml的內(nèi)容如下:
1 |
<? xml version = "1.0" encoding = "utf-8" ?> |
2 |
< linearlayout xmlns:android = "http://schemas./apk/res/android" android:layout_height = "match_parent" android:layout_width = "match_parent" android:orientation = "vertical" android:layout_gravity = "top" > |
3 |
< videoview android:layout_height = "fill_parent" android:layout_width = "fill_parent" android:id = "@+id/VideoView01" > |
4 |
</ videoview > |
5 |
</ linearlayout > |
4、MainVideo.java的內(nèi)容如下:
01 |
package android.basic.lesson28; |
02 |
03 |
import android.app.Activity; |
04 |
import android.net.Uri; |
05 |
import android.os.Bundle; |
06 |
import android.view.Window; |
07 |
import android.view.WindowManager; |
08 |
import android.widget.MediaController; |
09 |
import android.widget.VideoView; |
10 |
11 |
public class MainVideo extends Activity { |
12 |
/** Called when the activity is first created. */ |
13 |
@Override |
14 |
public void onCreate(Bundle savedInstanceState) { |
15 |
super .onCreate(savedInstanceState); |
16 |
//全屏 |
17 |
this .getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); |
18 |
//標題去掉 |
19 |
this .requestWindowFeature(Window.FEATURE_NO_TITLE); |
20 |
//要在全屏等設置完畢后再加載布局 |
21 |
setContentView(R.layout.main); |
22 |
23 |
//定義UI組件 |
24 |
VideoView videoView = (VideoView) findViewById(R.id.VideoView01); |
25 |
//定義MediaController對象 |
26 |
MediaController mediaController = new MediaController( this ); |
27 |
//把MediaController對象綁定到VideoView上 |
28 |
mediaController.setAnchorView(videoView); |
29 |
//設置VideoView的控制器是mediaController |
30 |
videoView.setMediaController(mediaController); |
31 |
32 |
//這兩種方法都可以 videoView.setVideoPath("file:///sdcard/love_480320.mp4"); |
33 |
videoView.setVideoURI(Uri.parse( "/sdcard/love_480320.mp4" )); |
34 |
//啟動后就播放 |
35 |
videoView.start(); |
36 |
} |
37 |
} |
5,、運行效果如下:
好了本講內(nèi)容就到這里,,下次再見。