所謂的多媒體就是指圖片,聲音和視頻對(duì)么?
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),象山企業(yè)網(wǎng)站建設(shè),象山品牌網(wǎng)站建設(shè),網(wǎng)站定制,象山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,象山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
買(mǎi)手機(jī)前準(zhǔn)備幾張顏色比較鮮艷,分辯率比較高的圖片,放在手機(jī)上看效果,注意看手機(jī)屏幕顯示的色塊多不多,色塊太多的話證明屏幕的可顯示顏色較低.再就是分辯率,現(xiàn)在的手機(jī)都會(huì)給出很具體的參數(shù),其實(shí)直接看參數(shù)就可以了,不用這么糾結(jié)的.如果還是不放心的話,檢查手機(jī)時(shí)就把仔細(xì)地檢查屏幕,看顯示的顆粒感強(qiáng)不強(qiáng),一般400*800以上的分辯率肉眼已經(jīng)很難看出顆粒感了.
檢查聲音的道理跟上面差不多,準(zhǔn)備一兩首音質(zhì)比較高的mp3或者其他格式的音頻,在手機(jī)上播放,包括耳機(jī)和外放.
視頻也如上,不再碼字.
如果信不過(guò)自己的眼睛的話還可以用Aurora Softworks和Quadrant這兩個(gè)軟件進(jìn)行直觀的測(cè)試.跑完后直接看分?jǐn)?shù)就OK了
主要涉及類:MediaPlayer
(1) 當(dāng)一個(gè)MediaPlayer對(duì)象被創(chuàng)建或者調(diào)用reset()方法之后,它處于空閑狀態(tài),調(diào)用release()方法后處于結(jié)束狀態(tài)
1,一個(gè)MediaPlayer對(duì)象調(diào)用了reset()方法后,再調(diào)用其它方法可能會(huì)觸發(fā)OnErrorListener.onError()事件,未調(diào)用reset()方法則不會(huì)觸發(fā)
2,當(dāng)Mediaplayer對(duì)象不再被使用時(shí),最好調(diào)用release()方法對(duì)其進(jìn)行釋放,使其處于結(jié)束狀態(tài),此時(shí)它不能被使用
3,Mediaplayer對(duì)象被創(chuàng)建時(shí)(調(diào)用構(gòu)造方法)處于空閑狀態(tài),若使用create()方法創(chuàng)建后則處于準(zhǔn)備狀態(tài)。
(2) 一般情況下,一些常用的播放控制操作可能因?yàn)橐纛l、視頻的格式不被支持或者質(zhì)量較差以及流超時(shí),也有可能由于開(kāi)發(fā)者的疏忽使得Mediaplayer對(duì)象處于無(wú)效狀態(tài)等而導(dǎo)致錯(cuò)誤。此時(shí)可通過(guò)注冊(cè)setOnErrorListener方法實(shí)現(xiàn)監(jiān)控。如果發(fā)生了錯(cuò)誤,Mediaplayer對(duì)象將處于多霧狀態(tài),可以使用reset()方法來(lái)回復(fù)錯(cuò)誤。
(3) 任何Mediaplayer對(duì)象都必須先處于準(zhǔn)備狀態(tài),然后才開(kāi)始播放
(4) 要開(kāi)始播放Mediaplayer對(duì)象都必須成功調(diào)用start()方法,可通過(guò)isPlaying()方法來(lái)檢測(cè)是否正在播放
(5) 當(dāng)Mediaplayer對(duì)象在播放時(shí),可以進(jìn)行暫停和停止操作,pause()方法暫停播放,stop()方法停止播放。處于暫停暫停時(shí)可通過(guò)start()方法恢復(fù)播放,但是處于停止?fàn)顟B(tài)時(shí)則必須先調(diào)用prepare()方法使其處于準(zhǔn)備狀態(tài),再調(diào)用start()方法。
主要方法:
Mediaplayer:構(gòu)造方法
create: 創(chuàng)建一個(gè)要播放的多媒體
getCurrentPosition:得到當(dāng)前播放位置
getDuration: 得到文件的時(shí)間
prepare: 準(zhǔn)備(同步)
prepareAsync:準(zhǔn)備(異步)
seekTo: 指定播放的位置(以毫秒為單位)
setAudioStreamType: 設(shè)置流媒體的類型
setDataSource: 設(shè)置數(shù)據(jù)來(lái)源
setDisplay: 設(shè)置用SurfaceHolder來(lái)顯示多媒體
setOnBufferingUpdateListener: 網(wǎng)絡(luò)流媒體的緩沖監(jiān)聽(tīng)
setOnErrorListener: 設(shè)置錯(cuò)誤信息監(jiān)聽(tīng)
setOnVideoSizeChangedListener:視頻尺寸監(jiān)聽(tīng)
setScreenOnWhilePlaying: 設(shè)置是否使用SurfaceHolder來(lái)顯示
setVolume: 設(shè)置音量
//獲取sd卡上的音頻文件
setDataSource(“/sdcard/test.mp3”);
//裝載資源中的音樂(lè)
MediaPlayer.create(Activity01.this,R.raw.test);
//目前存在問(wèn)題,不能循環(huán)解析出音頻文件
原因:.android_secure文件夾受保護(hù),無(wú)法獲取里面的文件信息
播放視頻
相關(guān)類:VideoView
方法說(shuō)明:
getBufferPercentage:得到緩沖的百分比
getCurrentPosition:得到當(dāng)前播放位置
getDuration:得到視頻文件的時(shí)間
resolveAdjustedSize:調(diào)整視頻顯示大小
setMediaController:設(shè)置播放控制器模式(播放進(jìn)度條)
setOnCompletionListener:當(dāng)視頻文件播放完時(shí)觸發(fā)事件
setVideoPath:設(shè)置視頻源路徑
setVideoURI:設(shè)置視頻源地址
錄音
相關(guān)類:MediaRecorder
方法說(shuō)明:
MediaRecorder:構(gòu)造方法
getMaxAmplitude:得到最大幅度
setAudioEncoder:設(shè)置音頻編碼
setAudioSource:設(shè)置音頻源
setCamera:設(shè)置攝像機(jī)
setMaxDuration:設(shè)置最長(zhǎng)錄音時(shí)間
setMaxFileSize:設(shè)置文件的最大尺寸
setOutputFile:設(shè)置輸出文件
setOutputFormat:設(shè)置輸出文件格式
setPreviewDisplay:設(shè)置預(yù)覽
setVideoEncoder:設(shè)置視頻編碼
setVideoFrameRate:設(shè)置視頻幀的頻率
setVideoSize:設(shè)置視頻的寬度和高度(分辨率)
setVideoSource:設(shè)置視頻源
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.
系統(tǒng)會(huì)自動(dòng)在prefix和suffix之間加上一些數(shù)字來(lái)構(gòu)建完整的文件名
實(shí)現(xiàn)錄音的一般步驟:
1, 實(shí)例化MediaRecorder mr,調(diào)用構(gòu)造方法
2, 初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)
3, 配置DataSource:設(shè)置輸出文件格式/路徑,編碼器等
4, 準(zhǔn)備錄制:mr.prepare()
5, 開(kāi)始錄制:mr.start()
6, 停止錄制:mr.stop()
7, 釋放資源:mr.release()
注:2,3不可調(diào)換順序
添加許可:
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/
uses-permission android:name="android.permission.RECORD_AUDIO"
相機(jī)設(shè)置
相關(guān)類:Camera,它是專門(mén)用來(lái)連接和斷開(kāi)相機(jī)服務(wù)的類
Camera的幾個(gè)事件:
Camera.AutoFocusCallback: 自動(dòng)調(diào)焦功能
Camera.ErrorCallback: 錯(cuò)誤信息捕捉
Camera.Parameters: 相機(jī)的屬性參數(shù)
Camera.PictureCallback: 拍照、產(chǎn)生圖片時(shí)觸發(fā)
Camera.PreviewCallback: 相機(jī)預(yù)覽設(shè)置
Camera.ShutterCallback: 快門(mén)設(shè)置
Camera.Size: 圖片的尺寸
Camera類沒(méi)有構(gòu)造方法,可通過(guò)open()方法來(lái)打開(kāi)相機(jī)設(shè)備
Camera類的方法介紹:
autoFocus: 設(shè)置自動(dòng)對(duì)焦
getParameters: 得到相機(jī)參數(shù)
open: 啟動(dòng)相機(jī)服務(wù)
release: 釋放相機(jī)服務(wù)
setParameters: 設(shè)置參數(shù)
setPreviewDisplay:設(shè)置預(yù)覽
startPreview: 開(kāi)始預(yù)覽
stopPreview: 停止預(yù)覽
takePicture: 拍照
注:takePicture方法要實(shí)現(xiàn)3個(gè)回調(diào)函數(shù)作為它的三個(gè)參數(shù):Camera.ShutterCallback(快門(mén)),和兩個(gè)Camera.Picture.Callback(圖像數(shù)據(jù))。
需要許可
uses-permission android:name="android.permission.CAMERA" /
若要將圖片存儲(chǔ)至sd卡中,則需要sd卡讀寫(xiě)許可
目前存在問(wèn)題:只能拍照一次,不能重新回到預(yù)覽界面
鬧鐘設(shè)置
相關(guān)類:AlarmManager,它是專門(mén)用來(lái)設(shè)定在某個(gè)指定的時(shí)間去完成指定的事件。AlarmManager提供了訪問(wèn)系統(tǒng)警報(bào)的服務(wù),只要在程序中設(shè)置了警報(bào)服務(wù),AlarmManager就會(huì)通過(guò)onReceive()方法去執(zhí)行這些事件,就算系統(tǒng)處于待機(jī)狀態(tài),同樣不會(huì)影響運(yùn)行??赏ㄟ^(guò)Context.getSystemService(ALARM_SERVICE)方法來(lái)獲得該服務(wù)。
方法說(shuō)明:
cancel: 取消AlarmManager服務(wù)
set: 設(shè)置AlarmManager服務(wù)
setInexactRepeating:設(shè)置不精確周期
setRepeating:設(shè)置精確周期
setTimeZone:設(shè)置時(shí)區(qū)
注:需創(chuàng)建一個(gè)BroadcastReceiver的子類,并覆蓋onReceive()方法
鈴聲設(shè)置
系統(tǒng)自帶的鈴聲都放在/system/medio/audio/文件夾中
鈴音類型: TYPE_RINGTONE(來(lái)電鈴音),TYPE_ALARM,TYPE_NOTIFICATION
相關(guān)類:RingtoneManager
方法介紹:
getActualDefaultRingtoneUri:取得指定類型的鈴聲
getCursor:返回所有可用鈴聲的游標(biāo)
getDefaultType:得到指定URI默認(rèn)的鈴聲類型
getRingtone
getRingtonePosition:得到鈴聲位置
getRingtoneUri
getValidRingtoneUri:得到一個(gè)可用鈴聲的URI
isDefault:得到指定的Uri是否為默認(rèn)的鈴聲
setActualDefaultRingtoneUri:設(shè)置默認(rèn)的鈴聲
獲取的Cursor共有4列,列名依次為:_id,title,”content://media/internal/audio/media”,title_key
以設(shè)置手機(jī)鈴音為例:
if (isFolder(strRingtongFolder)) {//如果不存在該文件夾則創(chuàng)建一個(gè)
// 打開(kāi)系統(tǒng)鈴聲設(shè)置
Intent intent = new Intent(
RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI, true);
// 類型為來(lái)電ringtong
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
RingtoneManager.TYPE_RINGTONE);
// 設(shè)置顯示的題目
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "設(shè)置來(lái)電的鈴聲");
// 當(dāng)設(shè)置完成之后返回到當(dāng)前的activity
startActivityForResult(intent, RingtongButton);
}
然后復(fù)寫(xiě)onActivityResult(int requestCode, int resultCode, Intent data)方法,resultCode就是點(diǎn)擊設(shè)置dialog的按鈕編號(hào),需要判斷是否點(diǎn)擊了確認(rèn)按鈕
if (resultCode != RESULT_OK) {
return;
}
try {
// 得到我們選擇的鈴聲
Uri pickedUri = data .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
// 將我們選擇的鈴聲選擇成默認(rèn)
if (pickedUri != null) {
RingtoneManager.setActualDefaultRingtoneUri(
Media_RingTongActivity.this,
RingtoneManager.TYPE_RINGTONE, pickedUri);
}
} catch (Exception e) {
e.printStackTrace();
}
聽(tīng)你這樣說(shuō),很明顯就是手機(jī)的無(wú)法容納超過(guò)分辨率過(guò)高和采樣率過(guò)大的視頻。如果你做過(guò)phonegap的話,你會(huì)發(fā)現(xiàn)4.0可以支持html5的視頻播放,而3.0以下的肯定無(wú)法播放,一個(gè)道理。里面的機(jī)制無(wú)法支持容納
1、解碼流程:
根據(jù)FFmpeg中視頻解碼器的名稱找到對(duì)應(yīng)手機(jī)硬解碼器,如果存在則可以硬解碼,
走硬解碼流程;不存在就只能走軟解碼流程。
2、硬解碼:
使用MediaCodec直接解碼AVpacket,此時(shí)需要對(duì)AVPacket進(jìn)行格式過(guò)濾,然后
MediaCodec解碼后的數(shù)據(jù)用OpenGL ES渲染出來(lái)。
3、軟解碼:
直接用OpenGL ES 渲染YUV數(shù)據(jù)。
MediaCodecList.getCodecCount()支持的最低的SDK版本是16,buile.gradle中改 minSdkVersion 16
宏定義硬解碼、軟解碼
知道優(yōu)酷m3u8的可以拼接了將傳到播放器里inten的data 拼接一下成為可以播的m3u8設(shè)置到setdatasource里面,土豆的也可以但是要麻煩些要獲取縮略圖的地址再轉(zhuǎn)成m3u8的。還有更好的方法嘛,直接調(diào)javascript
Android平臺(tái)下SeeJoPlayer視頻播放器(功能介紹及源碼解析,附源碼)