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