當前位置:首頁 » 安卓系統 » mediaplayerandroid

mediaplayerandroid

發布時間: 2023-10-01 23:14:00

『壹』 android的MediaPlayer支持哪些視頻格式

Android官方公布的文檔顯示MediaPlayer支持如下視頻格式:

Video H.263 X X 3GPP (.3gp) and MPEG-4 (.mp4)
H.264 AVC X 3GPP (.3gp) and MPEG-4 (.mp4)
MPEG-4 SP X 3GPP (.3gp)

這些格式的視頻,基本上屬於手機支持的視頻格式。如果想觀看其他類型格式的視頻,比如flv等,需要下載暴風、迅雷等播放器。

『貳』 androidmediaplayer默認是分段載入

這意味著它會從網路流中下載並緩沖較小的數據姿飢塊,並跡沖返在接收到足夠的數據後開始播放。當播放器緩沖區中的數據不足以支持連續播放時,它將嘗試下載更多的數據。這種邊下載判漏邊播放的方式旨在提高播放的穩定性和流暢性,在網路條件不理想或者網路速度不夠快的情況下,也能保證視頻可以順暢播放。不過也可能會導致初始載入時間稍長一些,因為需要先緩沖一段數據才能開始播放。

『叄』 android MediaPlayer如何播放中文文件MP3

大概思路
1、在一個Activity類中,搞一個按鈕,點擊該按鈕後,使用intent在後台啟動一個service,。
2、寫一個普通類extends Service,在這個service中進行Mp3文件的播放。
流程代碼如下:
1、public class PlayerActivity extends Activity{
class StartButtonListener implements OnClickListener{
public void onClick( View v ){
/*----創建一個Intent對象,用於通知Service開始播放Mp3文件-----*/
Intent intent = new Intent();
intent.setClass( PlayerActivity.this, PlayerService.class );
intent.putExtra("mp3Info", mp3Info );
intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG );
startService ( intent );//啟動Service
}
}
}

2、public class PlayerService extends Service{
/**---獲得從PlayerActivity傳來的intent,啟動PlayerService,並執行該方法 根據intent中包含的 指令,進行Mp3的播放---------------*/
public int onStartCommand(Intent intent, int flags, int startId) {
mp3Info = ( Mp3Info )intent.getSerializableExtra( "mp3Info" );
int MSG = intent.getIntExtra( "MSG", 0 );
if ( mp3Info != null ){
if( MSG == AppConstant.PlayerMsg.PLAY_MSG );{
play ( mp3Info );
}
}
else{
if ( MSG == AppConstant.PlayerMsg.PAUSE_MSG ){
pause( );
}
else if ( MSG == AppConstant.PlayerMsg.STOP_MSG ){
stop( );
}
}
return super.onStartCommand(intent, flags, startId );
}

private void play(Mp3Info mp3Info ){
if( !isPlaying ){
fileUtils = new FileUtils();
String path = fileUtils.getMp3Path ( mp3Info ); //獲取Mp3文件在SDCard中的位置
mediaPlayer = MediaPlayer.create( this, Uri.parse("file://" + path) );//這里Uri.parse表示,獲取SDCard中的文件,協議是file://
mediaPlayer.setLooping(false);
mediaPlayer.start(); //mediaPlayer在得到,Mp3文件在SDCard中的位置後,就可以進行播放了
}
}

}

『肆』 安卓 能用mediarecorder和mediaplayer實現即時語音嗎

android語音錄制可以通過MediaRecorder和AudioRecorder。
MediaRecorder本來是多媒體錄制控制項,可以同時錄制視頻和語音,當不指定視頻源時就只錄制語音;AudioRecorder只能錄制語音。
二者錄制的區別在於,MediaRecorder固定了語音的編碼格式,具體平台支持類型可以在http://developer.android.com/guide/appendix/media-formats.html這里查看,而且使用時指定輸出文件,在錄制的同時系統將語音數據寫入文件。AudioRecorder輸出的是pcm,即原始音頻數據,使用者需要自己讀取這些數據,這樣的好處是可以根據需要邊錄制邊對音頻數據處理,讀取的同時也可以保存到文件進行存儲

語音的播放可以使用MediaPlayer和AudioTracker,與上面的對應,MediaPlayer可以播放各種多媒體文件,而AudioTracker只能播放pcm數據,使用者手動將數據連續寫入進行播放。

MediaRecorder的使用
[java] view plain print?
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}

mRecorder.start();
}

AudioRecorder錄制語音

[java] view plain print?
int suggestBufferSize = AudioRecord.getMinBufferSize(mSampleRate,
mChannelConfig, mAudioFormat);
mAudioRecord = new AudioRecord(AudioSource.MIC, mSampleRate,
mChannelConfig, mAudioFormat, suggestBufferSize);
mAudioRecorder.startRecording();
byte[] inByteBuf = new byte[BUF_SIZE]
while (runFlag) {
int readSize = mAudioRecord.read(inByteBuf, 0, inByteBuf.length);
}
mAudioRecorder.stop();
mAudioRecord.release();

上面是AudioRecorder的完整使用過程,AudioRecorder實例化的時候需要指定錄音源、采樣率等音頻參數,最後一個是音頻數據緩沖區大小,需要通過AudioRecord.getMinBufferSize()來得到緩沖區的最小值,如果實例化時參數小於這個最小值,那麼AudioRecoder將創建失敗。當然大於這個值肯定可以。之後通過read將緩沖區的數據讀出來。
之前一直以為讀取時使用的byte數組大小必須和緩沖區的大小一致,但實際並不是這樣,看下AudioRecorder構造函數中對bufferSizeInBytes的解釋:
bufferSizeInBytes the total size (in bytes) of the buffer where audio data is written to ring the recording. New audio data can be read from this buffer in smaller chunks than this size.
也就是說緩沖區只是系統用來臨時存放音頻數據的,讀取時可以每次讀取較小的塊,然後多次讀取。

AudioRecorder還有一個方法setPositionNotificationPeriod (int periodInFrames)。這個方法可以在讀取指定數據後發出一個回調,需要配合 (AudioRecord. listener),當讀取的總數據是指定的periodInFrames的整數倍時就會調用listner的方法onPeriodicNotification.

[java] view plain print?
new () {

@Override
public void onPeriodicNotification(AudioRecord recorder) {
// TODO Auto-generated method stub

}

@Override
public void onMarkerReached(AudioRecord recorder) {
// TODO Auto-generated method stub

}
};

這個特性使用時有個注意點,就是回調只會發生在實際數據讀取之後,也就是使用者通過read方法讀取出periodInFrames這么多數據時才會觸發這個回調,否則什麼也不會發生。

MeidaPlayer播放音頻文件

[java] view plain print?
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.stop();
mediaPlayer.release();

其中setDataSource()有多個覆寫,如下
void setDataSource(String path)
Sets the data source (file-path or http/rtsp URL) to use.
void setDataSource(Context context, Uri uri, Map<String, String> headers)
Sets the data source as a content Uri.
void setDataSource(Context context, Uri uri)
Sets the data source as a content Uri.
void setDataSource(FileDescriptor fd, long offset, long length)
Sets the data source (FileDescriptor) to use.
void setDataSource(FileDescriptor fd)
Sets the data source (FileDescriptor) to use.
可以看到不同的輸入參數指定了數據的來源。其中setDataSource(FileDescriptor fd, long offset, long length)可以指定開始讀取的偏移量和長度。
之所以會注意到這個參數是因為在實際使用時有一個需求,即可以播放WAV文件,又可以播放MP3文件,而且能夠限定播放開始和結束的位置。
對於MP3文件使用setDataSource(FileDescriptor fd, long offset, long length)是完全可行的,像這樣

[java] view plain print?
mPlayer.reset();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(
new FileInputStream(mSoundFile.getFilePath()).getFD(),
startByte, endByte - startByte);
[java] view plain print?
mPlayer.prepare();

但WAV文件卻完全沒有效果,是什麼原因呢,看下官方對setDataSource(FileDescriptor fd, long offset, long length)的解釋
Sets the data source (FileDescriptor) to use. The FileDescriptor must be seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility to close the file descriptor. It is safe to do so as soon as this call returns.

注意到該方法指定的文件類型必須是seekable的,mp3文件屬於這種類型(tips:不知道還有沒有其他類型),因為mp3內部是按幀存儲的,可以指定到具體的幀位置,而WAV文件音頻數據是pcm,也就是一大片完整的數據,要對wav文件指定開始播放位置,需要使用另一個方法seekTo (int msec)。這里指定的參數是毫秒。

開始時間可以指定了,那結束播放的時間如何指定?

MediaPlayer有另外兩個方法:getDuration ()和getCurrentPosition (),這兩個返回的都是時間信息,前者返回總的播放時間,後者返回當前播放位置的時間。

那返回的結果對於mp3和wav是否會不同呢?會!
對WAV類型,getDuration返回的是音頻文件的總時間,getCurrentPosition返回的是從文件起始到現在的播放時間;而對mp3類型,getDuration返回的是startByte和endByte之間播放的時間間隔,getCurrentPosition返回從startByte到現在的播放時間。想一下原因也可以明白,因為MP3是可以精確指定起始位置的,所以所有計算都可以從指定的位置開始,而wav文件一切只能從最開始的位置計算。

『伍』 android 怎樣獲得mediaplayer播放的音頻數據

Android中音頻和視頻的播放我們最先想到的就是MediaPlayer類了,該類提供了播放、暫停、停止、和重復播放等方法。該類位於android.media包下,詳見API文檔。其實除了這個類還有一個音樂播放類那就是SoundPool,這兩個類各有不同分析一下便於大家理解

MediaPlayer:

此類適合播放較大文件,此類文件應該存儲在SD卡上,而不是在資源文件里,還有此類每次只能播放一個音頻文件。

此類用法如下:

1、從資源文件中播放

MediaPlayer player = new MediaPlayer.create(this,R.raw.test);

player.stare();

2、從文件系統播放

MediaPlayer player = new MediaPlayer();

String path = "/sdcard/test.mp3";

player.setDataSource(path);

player.prepare();

player.start();

3、從網路播放

(1)通過URI的方式:

String path="http://**************.mp3"; //這里給一個歌曲的網路地址就行了

Uri uri = Uri.parse(path);

MediaPlayer player = new MediaPlayer.create(this,uri);

player.start();

(2)通過設置數據源的方式:

MediaPlayer player = new MediaPlayer.create();

String path="http://**************.mp3"; //這里給一個歌曲的網路地址就行了

player.setDataSource(path);

player.prepare();

player.start();

SoundPool:

此類特點就是低延遲播放,適合播放實時音實現同時播放多個聲音,如游戲中炸彈的爆炸音等小資源文件,此類音頻比較適合放到資源文件夾 res/raw下和程序一起打成APK文件。

用法如下:

SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);

HashMap<Integer, Integer> soundPoolMap = new HashMap<Integer, Integer>();

soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong1, 1));

soundPoolMap.put(2, soundPool.load(this, R.raw.dingdong2, 2));

public void playSound(int sound, int loop) {

AudioManager mgr = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);

float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);

float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

float volume = streamVolumeCurrent/streamVolumeMax;

soundPool.play(soundPoolMap.get(sound), volume, volume, 1, loop, 1f);

//參數:1、Map中取值 2、當前音量 3、最大音量 4、優先順序 5、重播次數 6、播放速度

}

this.playSound(1, 0);

『陸』 android中如何判斷mediaplayer已經停止

1、release是當MediaPlayer對象(以下簡稱mp)不再使用才去釋放mp所佔有的資源。不是一首歌完了之後要用的,而是你不再使用mp之後才調用,比如退出。
2、start和stop之間循環的流程應該是:reset()-->setDataSource(path)-->prepare()-->start()-->stop()--reset()-->重來上述流程一遍。
3、判斷停止是要用到
MediaPlayer.OnCompletionListener
mCompleteListener的方法監聽。
你對mediaplayer整個流程的理解有點混亂,建議多看代碼吧。

『柒』 如何單元測試android mediaplayer

主要涉及類:MediaPlayer
(1) 當一個MediaPlayer對象被創建或者調用reset()方法之後,它處於空閑狀態,調用release()方法後處於結束狀態
1,一個MediaPlayer對象調用了reset()方法後,再調用其它方法可能會觸發OnErrorListener.onError()事件,未調用reset()方法則不會觸發
2,當Mediaplayer對象不再被使用時,最好調用release()方法對其進行釋放,使其處於結束狀態,此時它不能被使用
3,Mediaplayer對象被創建時(調用構造方法)處於空閑狀態,若使用create()方法創建後則處於准備狀態。
(2) 一般情況下,一些常用的播放控制操作可能因為音頻、視頻的格式不被支持或者質量較差以及流超時,也有可能由於開發者的疏忽使得Mediaplayer對象處於無效狀態等而導致錯誤。此時可通過注冊setOnErrorListener方法實現監控。如果發生了錯誤,Mediaplayer對象將處於多霧狀態,可以使用reset()方法來回復錯誤。
(3) 任何Mediaplayer對象都必須先處於准備狀態,然後才開始播放
(4) 要開始播放Mediaplayer對象都必須成功調用start()方法,可通過isPlaying()方法來檢測是否正在播放
(5) 當Mediaplayer對象在播放時,可以進行暫停和停止操作,pause()方法暫停播放,stop()方法停止播放。處於暫停暫停時可通過start()方法恢復播放,但是處於停止狀態時則必須先調用prepare()方法使其處於准備狀態,再調用start()方法。
主要方法:
Mediaplayer:構造方法
create: 創建一個要播放的多媒體
getCurrentPosition:得到當前播放位置
getDuration: 得到文件的時間
prepare: 准備(同步)
prepareAsync:准備(非同步)
seekTo: 指定播放的位置(以毫秒為單位)
setAudioStreamType: 設置流媒體的類型
setDataSource: 設置數據來源
setDisplay: 設置用SurfaceHolder來顯示多媒體
setOnBufferingUpdateListener: 網路流媒體的緩沖監聽
setOnErrorListener: 設置錯誤信息監聽
setOnVideoSizeChangedListener:視頻尺寸監聽
setScreenOnWhilePlaying: 設置是否使用SurfaceHolder來顯示
setVolume: 設置音量
//獲取sd卡上的音頻文件
setDataSource(「/sdcard/test.mp3」);
//裝載資源中的音樂
MediaPlayer.create(Activity01.this,R.raw.test);
//目前存在問題,不能循環解析出音頻文件
原因:.android_secure文件夾受保護,無法獲取裡面的文件信息
播放視頻
相關類:VideoView
方法說明:
getBufferPercentage:得到緩沖的百分比
getCurrentPosition:得到當前播放位置
getDuration:得到視頻文件的時間
resolveAdjustedSize:調整視頻顯示大小
setMediaController:設置播放控制器模式(播放進度條)
setOnCompletionListener:當視頻文件播放完時觸發事件
setVideoPath:設置視頻源路徑
setVideoURI:設置視頻源地址
錄音
相關類:MediaRecorder
方法說明:
MediaRecorder:構造方法
getMaxAmplitude:得到最大幅度
setAudioEncoder:設置音頻編碼
setAudioSource:設置音頻源
setCamera:設置攝像機
setMaxDuration:設置最長錄音時間
setMaxFileSize:設置文件的最大尺寸
setOutputFile:設置輸出文件
setOutputFormat:設置輸出文件格式
setPreviewDisplay:設置預覽
setVideoEncoder:設置視頻編碼
setVideoFrameRate:設置視頻幀的頻率
setVideoSize:設置視頻的寬度和高度(解析度)
setVideoSource:設置視頻源
File類下的方法:
public static File createTempFile(String prefix, String suffix, File directory)
Creates an empty temporary file in the given directory using the given prefix and suffix as part of the file name.
系統會自動在prefix和suffix之間加上一些數字來構建完整的文件名
實現錄音的一般步驟:
1, 實例化MediaRecorder mr,調用構造方法
2, 初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)
3, 配置DataSource:設置輸出文件格式/路徑,編碼器等
4, 准備錄制:mr.prepare()
5, 開始錄制:mr.start()
6, 停止錄制:mr.stop()
7, 釋放資源:mr.release()
註:2,3不可調換順序
添加許可:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO">
相機設置
相關類:Camera,它是專門用來連接和斷開相機服務的類
Camera的幾個事件:
Camera.AutoFocusCallback: 自動調焦功能
Camera.ErrorCallback: 錯誤信息捕捉
Camera.Parameters: 相機的屬性參數
Camera.PictureCallback: 拍照、產生圖片時觸發
Camera.PreviewCallback: 相機預覽設置
Camera.ShutterCallback: 快門設置
Camera.Size: 圖片的尺寸
Camera類沒有構造方法,可通過open()方法來打開相機設備
Camera類的方法介紹:
autoFocus: 設置自動對焦
getParameters: 得到相機參數
open: 啟動相機服務
release: 釋放相機服務
setParameters: 設置參數
setPreviewDisplay:設置預覽
startPreview: 開始預覽
stopPreview: 停止預覽
takePicture: 拍照
註:takePicture方法要實現3個回調函數作為它的三個參數:Camera.ShutterCallback(快門),和兩個Camera.Picture.Callback(圖像數據)。
需要許可
<uses-permission android:name="android.permission.CAMERA" />
若要將圖片存儲至sd卡中,則需要sd卡讀寫許可
目前存在問題:只能拍照一次,不能重新回到預覽界面
鬧鍾設置
相關類:AlarmManager,它是專門用來設定在某個指定的時間去完成指定的事件。AlarmManager提供了訪問系統警報的服務,只要在程序中設置了警報服務,AlarmManager就會通過onReceive()方法去執行這些事件,就算系統處於待機狀態,同樣不會影響運行。可通過Context.getSystemService(ALARM_SERVICE)方法來獲得該服務。
方法說明:
cancel: 取消AlarmManager服務
set: 設置AlarmManager服務
setInexactRepeating:設置不精確周期
setRepeating:設置精確周期
setTimeZone:設置時區
註:需創建一個BroadcastReceiver的子類,並覆蓋onReceive()方法
鈴聲設置
系統自帶的鈴聲都放在/system/medio/audio/文件夾中
鈴音類型: TYPE_RINGTONE(來電鈴音),TYPE_ALARM,TYPE_NOTIFICATION
相關類:RingtoneManager
方法介紹:
getActualDefaultRingtoneUri:取得指定類型的鈴聲
getCursor:返回所有可用鈴聲的游標
getDefaultType:得到指定URI默認的鈴聲類型
getRingtone
getRingtonePosition:得到鈴聲位置
getRingtoneUri
getValidRingtoneUri:得到一個可用鈴聲的URI
isDefault:得到指定的Uri是否為默認的鈴聲
setActualDefaultRingtoneUri:設置默認的鈴聲
獲取的Cursor共有4列,列名依次為:_id,title,」content://media/internal/audio/media」,title_key
以設置手機鈴音為例:
if (isFolder(strRingtongFolder)) {//如果不存在該文件夾則創建一個
// 打開系統鈴聲設置
Intent intent = new Intent(
RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, true);
// 類型為來電ringtong
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
RingtoneManager.TYPE_RINGTONE);
// 設置顯示的題目
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "設置來電的鈴聲");
// 當設置完成之後返回到當前的activity
startActivityForResult(intent, RingtongButton);
}
然後復寫onActivityResult(int requestCode, int resultCode, Intent data)方法,resultCode就是點擊設置dialog的按鈕編號,需要判斷是否點擊了確認按鈕
if (resultCode != RESULT_OK) {
return;
}
try {
// 得到我們選擇的鈴聲
Uri pickedUri = data .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
// 將我們選擇的鈴聲選擇成默認
if (pickedUri != null) {
RingtoneManager.setActualDefaultRingtoneUri(
Media_RingTongActivity.this,
RingtoneManager.TYPE_RINGTONE, pickedUri);
}
} catch (Exception e) {
e.printStackTrace();
}

熱點內容
javalist重復 發布:2024-05-04 06:19:27 瀏覽:509
max腳本管理 發布:2024-05-04 06:02:31 瀏覽:44
自行搭建伺服器 發布:2024-05-04 06:01:12 瀏覽:125
h3c如何查看所有配置 發布:2024-05-04 05:26:39 瀏覽:493
java統計字元串中字母個數 發布:2024-05-04 05:22:58 瀏覽:888
throwablejava 發布:2024-05-04 05:22:56 瀏覽:792
IP和伺服器可以分開架設嗎 發布:2024-05-04 05:17:48 瀏覽:28
ip提取源碼 發布:2024-05-04 05:01:42 瀏覽:763
駕校報名了密碼是什麼 發布:2024-05-04 04:49:02 瀏覽:610
安卓加密的rar軟體 發布:2024-05-04 04:18:30 瀏覽:606