Android视频录制
視屏錄制 播放分二種方式
Demo實(shí)例:https://download.csdn.net/download/weixin_41956752/10692732
一:?
通過(guò)Intent的方式:Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
二:
使用Camera的API,調(diào)用Media的MediaRecorder。
?
首先第一種:
Intent的方式
注意:這里播放camera錄制的視頻使用VideoView,不使用MediaPlayer和SurfaceView的結(jié)合。用幀布局Framelayout布局,VideoView和ImageView,播放時(shí)隱藏視頻縮略圖,暫停時(shí)或初始化時(shí)顯示視頻縮略圖。
因?yàn)?/span>VideoView沒(méi)有設(shè)置監(jiān)聽(tīng)播放和暫停狀態(tài)的事件,所以我自定義一個(gè)CustomVideoView繼承了VideoView,在里面創(chuàng)建一個(gè)監(jiān)聽(tīng)方法和重寫VideoView的播放、暫停的方法。
使用相機(jī)intent獲取視頻是使用最少代碼使得你的應(yīng)用獲取視頻的捷徑.一個(gè)視頻獲取intent可以包含以下額外信息:
?
MediaStore.EXTRA_OUTPUT-此設(shè)置需要一個(gè)保存視頻的路徑和文件名的Uri.此設(shè)置是可選的但是強(qiáng)列推薦的.如果你不指定此值,相機(jī)應(yīng)用就把請(qǐng)求到的圖像以默認(rèn)的文件名保存到默認(rèn)的文件夾下,這些信息保存在返回的intent的Intent.getData()字段中.
MediaStore.EXTRA_VIDEO_QUALITY-?此值在最低質(zhì)量最小文件尺寸時(shí)是0,在最高質(zhì)量最大文件尺寸時(shí)是1.
MediaStore.EXTRA_DURATION_LIMIT-?此值設(shè)置獲取視頻的長(zhǎng)度,以秒為單位.
MediaStore.EXTRA_SIZE_LIMIT-?此值設(shè)置獲取視頻文件的大小,以字節(jié)為單位.
?
第二種:
?
方式二-MediaRecorder(中文:媒體記錄器)
注解:
SurfaceView(中文:曲面視圖)
Surfaceview是什么?
它擁有獨(dú)立的繪圖表面,即它不與其宿主窗口共享同一個(gè)繪圖表面。由于擁有獨(dú)立的繪圖表面,因此SurfaceView的UI就可以在一個(gè)獨(dú)立的線程中進(jìn)行繪制。又由于不會(huì)占用主線程資源,SurfaceView一方面可以實(shí)現(xiàn)復(fù)雜而高效的UI,另一方面又不會(huì)導(dǎo)致用戶輸入得不到及時(shí)響應(yīng)。
SurfaceHolder??用于控制SurfaceView???(getHolder()?//?獲得SurfaceHolder對(duì)象)
SurfaceHolder.Callback具有如下的接口:
surfaceCreated(SurfaceHolder holder):
當(dāng)Surface第一次創(chuàng)建后會(huì)立即調(diào)用該函數(shù)。程序可以在該函數(shù)中做些和繪制界面相關(guān)的初始化工作,一般情況下都是在另外的線程來(lái)繪制界面,所以不要在這個(gè)函數(shù)中繪制Surface。?
surfaceChanged(SurfaceHolder holder, int format, int width,int height):
當(dāng)Surface的狀態(tài)(大小和格式)發(fā)生變化的時(shí)候會(huì)調(diào)用該函數(shù),在surfaceCreated調(diào)用后該函數(shù)至少會(huì)被調(diào)用一次。?
surfaceDestroyed(SurfaceHolder holder):
當(dāng)Surface被摧毀前會(huì)調(diào)用該函數(shù),該函數(shù)被調(diào)用后就不能繼續(xù)使用Surface了,一般在該函數(shù)中來(lái)清理使用的資源。
SurfaceView和View的比較
1,SurfaceView和View最大的區(qū)別在于,surfaceView是在一個(gè)新起的單獨(dú)線程中可以重新繪制畫(huà)面而View必須在UI的主線程中更新畫(huà)面。
SurfaceView和View的使用場(chǎng)景
1 ,被動(dòng)更新畫(huà)面的。比如棋類,這種用view就好了。因?yàn)楫?huà)面的更新是依賴于 onTouch 來(lái)更新,可以直接使用 invalidate。 因?yàn)檫@種情況下,這一次Touch和下一次的Touch需要的時(shí)間比較長(zhǎng)些,不會(huì)產(chǎn)生影響。
2 ,主動(dòng)更新。比如一個(gè)人在一直跑動(dòng)。這就需要一個(gè)單獨(dú)的thread不停的重繪人的狀態(tài),避免阻塞main UI thread。所以顯然view不合適,需要surfaceView來(lái)控制。
?
權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
例子中先用mediarecorder錄制保存一個(gè)視頻然后播放看看效果,點(diǎn)擊“跳轉(zhuǎn)”可以調(diào)到第二個(gè)Main2Activity中,用VideoView播放剛才錄制的視頻,Main2Activity主要測(cè)試如何播放在本地手機(jī)的視頻。
?
查看網(wǎng)址:https://blog.csdn.net/u013742672/article/details/72457490
?
?
為什么要進(jìn)行視屏壓縮?
視屏壓縮(去除掉原始數(shù)據(jù)中的一些冗余,然后再進(jìn)行傳輸或者存儲(chǔ),來(lái)減少對(duì)帶寬和存儲(chǔ)空間的需求)
假設(shè)用戶接入網(wǎng)帶寬為20M(在中國(guó),有這種接入網(wǎng)帶寬的用戶很少吧?),如果用戶想進(jìn)行實(shí)時(shí)的視頻通信(比如說(shuō)你想跟外地朋友進(jìn)行視頻聊天),假設(shè)你使用的圖像分辨率為4CIF(704*576),幀頻為25f/s.如果不進(jìn)行壓縮,大概需要多少呢?
每幅畫(huà)面的大小為:704*576*1.5*8 bit?= 4.64M,也就是說(shuō)每一幀為4.64M。如果想看流暢的視頻畫(huà)面,大概每秒需要傳輸25幀,也即需要4.64*25M = 116M的帶寬??
也就是說(shuō)如果不壓縮,20M的接入帶寬,連QQ聊天都做不了
me.?存儲(chǔ)和帶寬相對(duì)廉價(jià)的今天,要實(shí)現(xiàn)視頻的大容量存儲(chǔ)(如視頻監(jiān)控)和實(shí)時(shí)傳輸,沒(méi)有視頻壓縮幾乎不可能。
視頻壓縮現(xiàn)狀:
視頻壓縮編碼標(biāo)準(zhǔn)種類繁多,其中ITU下主導(dǎo)的H.26x系列和ISO主導(dǎo)的MPEG系列影響最大,應(yīng)用最為廣泛。早期,ITU下的H.26x主要應(yīng)用于實(shí)時(shí)領(lǐng)域;ISO的MPEG系列(它包括音頻壓縮標(biāo)準(zhǔn))主要應(yīng)用于廣播電視,VCD(MPEG1),DVD(MPEG2)存儲(chǔ)。ITU發(fā)展到H.264后,開(kāi)始與ISO的MPEG4融合。被納入MPEG-4的第十部分
目前主流的壓縮標(biāo)準(zhǔn)為H.264/AVC。它在實(shí)時(shí)傳輸和存儲(chǔ)領(lǐng)域已經(jīng)得到廣泛的應(yīng)用。H.264于2003年正式發(fā)布,距今已經(jīng)9年。我認(rèn)為H.264標(biāo)準(zhǔn)未來(lái)5年還是視頻應(yīng)用主力。其在IPTV,視頻監(jiān)控,視頻會(huì)議,和光盤存儲(chǔ)中將繼續(xù)占主導(dǎo)地位
?
視頻壓縮先進(jìn)性評(píng)價(jià):
網(wǎng)絡(luò)帶寬就是按每秒多少bit流來(lái)計(jì)算的,而存儲(chǔ)容量的最小單位為Byte,也就是字節(jié)(8bit)。存儲(chǔ)容量單位的1M表示1MB,等于網(wǎng)絡(luò)帶寬8Mb.
每秒大概數(shù)據(jù)量為593Mb。如果用戶帶寬為4Mb,想實(shí)現(xiàn)1080P?的實(shí)時(shí)會(huì)議或者監(jiān)控,最少需要將原始視頻壓縮近593/4 = 150倍。
?
視頻壓縮算法發(fā)展的動(dòng)力:
“一切動(dòng)力來(lái)自人類的無(wú)窮欲望”
視頻業(yè)務(wù)發(fā)展的基礎(chǔ):
視頻壓縮的核心思想就是利用視頻信號(hào)的特點(diǎn),去除視頻信號(hào)的時(shí)間和空間冗余
從H.261到H.264,MPEG1到MPEG4??未來(lái)還有H.265等更為先進(jìn)的算法出現(xiàn)
(1)算法本身的發(fā)展??(2)芯片能力??(3)網(wǎng)絡(luò)帶寬。這三者一起推動(dòng)了當(dāng)今高清視頻業(yè)務(wù)的普及,也是未來(lái)3D業(yè)務(wù)發(fā)展的技術(shù)基礎(chǔ)。
視頻會(huì)議壓縮算法之-H.264 High profile
AVC/H.264?規(guī)定了多種不同的Profile:最低Profile、主要Profile、擴(kuò)展Profile、高端Profile(這些Profile?本身還要?jiǎng)澐謹(jǐn)?shù)個(gè)等級(jí))。
-最低Profile,也叫做底線Profile(Baseline Profile)支持I/P?幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;
-擴(kuò)展Profile(Extended Profile)支持I/P/B/SP/SI?幀,只支持無(wú)交錯(cuò)(Progressive)和CAVLC;
-主要Profile(Main Profile)提供I/P/B?幀,支持無(wú)交錯(cuò)(Progressive)和交錯(cuò)(Interlaced),同樣提供對(duì)于CAVLC和CABAC?的支持;
-高端Profile(High Profile)在主要Profile?的基礎(chǔ)上增加了8x8?內(nèi)部預(yù)測(cè)、自定義量化、無(wú)損視頻編碼和更多的YUV?格式;
?
H.264中還有一個(gè)SVC概念(Scalable Video Coding),可分層編碼
1.帶寬問(wèn)題,IP網(wǎng)絡(luò)帶寬是不穩(wěn)定的,網(wǎng)絡(luò)帶寬降低是,視頻流應(yīng)該自動(dòng)的降低碼率,以適應(yīng)當(dāng)前帶寬。而視頻流碼率的降低,并不意味著視頻通信的結(jié)束,只是其幀率和分辨率相應(yīng)降低。這樣還是能維持基本的視頻通信如幀率可以從60fps降低30fps或者25fps甚至20pfs。分辨率可以從高清降到標(biāo)清的4cif甚至cif。這樣可以很大程度的降到碼率,但同時(shí)保證了視頻通信的基本功能正常進(jìn)行(用戶還是能看到能夠分辨的圖形和聽(tīng)到清晰的聲音)。
2.在未來(lái)的通信中,參與視頻對(duì)話的終端多種多樣,有專用的硬件視頻終端,有桌面軟終端,還有移動(dòng)終端中的PAD和手機(jī)。終端的多樣性對(duì)視頻碼流的要求也不一樣。如移動(dòng)終端一般相對(duì)帶寬較小,且屏幕尺寸也較小,屏幕寬高比也不同。每種終端希望拿到最適合自己的視頻碼流,既適合自己的網(wǎng)絡(luò)帶寬,又適合自己的硬件能力。如一種設(shè)備編碼流出來(lái)后,其中既包含了高清到標(biāo)清不同分辨率,又具有各種幀率。終端只需要發(fā)起申請(qǐng),從其中拿到適合自己的碼流,這是一件多好的事情,(好處)避免的轉(zhuǎn)碼,同時(shí)合理的利用的帶寬和終端的硬件能力。
SVC的本意就是如此,能夠?qū)崿F(xiàn)碼流的可伸縮,也就是說(shuō)能根據(jù)帶寬,終端的要求,自動(dòng)調(diào)整發(fā)送給終端視頻流的格式。一次性編碼適應(yīng)于多種信道和終端。視頻會(huì)議中有一種MCU設(shè)備,你要是研究MCU的功能,你會(huì)發(fā)現(xiàn)它多么適合采用SVC技術(shù)。SVC技術(shù)的應(yīng)用理論上應(yīng)該能節(jié)省MCU的部分計(jì)算資源。但一路SVC碼流實(shí)際上市多組碼流構(gòu)成的,它們是相互獨(dú)立的,如果全部傳輸和存儲(chǔ)必然是帶寬和容量的增加。因此這種技術(shù)適合使用在中央設(shè)備上(如MCU),終端上是不會(huì)使用到的。SVC希望做到一次編碼后,按需分配。
目前SVC技術(shù)應(yīng)用得不廣泛,RADVISION宣稱已經(jīng)支持。目前MCU所做的是要么按最低能力編碼發(fā)送,要么按數(shù)組能力編碼,數(shù)組碼流發(fā)送。SVC技術(shù)無(wú)法做到跨越視頻壓縮標(biāo)準(zhǔn),也就是所需要都在H,264或者其它莫一個(gè)相同的視頻壓縮標(biāo)準(zhǔn)之內(nèi),所以收端都支持該標(biāo)準(zhǔn)。如果跨域壓縮標(biāo)準(zhǔn)(如終端中支持的壓縮標(biāo)準(zhǔn)不相同,如只支持MPEG?或者只支持H.263或者只支持H.264),則終端設(shè)備還必須做轉(zhuǎn)碼才能實(shí)現(xiàn)互通。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Android视频录制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VB.NET创建/修复/压缩/备份/恢复
- 下一篇: android 字体修改颜色代码,And