本周給大家分享如何獲取視頻的每一幀的信息,說到這個那就得看我們的谷歌官方給我們的提供的api接口類:MediaMetadataRetriever,這個類是提供給我們用來獲取視頻信息的,
創(chuàng)新互聯(lián)建站長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為樂亭企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作,樂亭網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
官方文檔:
通過文檔我們知道,我們可以通過它提供的extractMetadata()方法獲取視頻基本信息,
例如:視頻寬、高,時長,作者等,還有通過getFrameAtTime()方法獲取對應(yīng)時長位置的視頻幀信息,返回的是一個bitmap對象
通過實(shí)踐知道,這個方法好是好,但是獲取視頻幀的速度太慢了,我自己做的實(shí)驗(yàn)是,獲取一個4分多鐘的視頻,每隔10秒取一幀,開了4個線程去取,時間大概在10秒左右,這樣對于我們來說是不可以忍受的,所以最后在github上找到了一個很好的庫推薦給大家:
這個庫是基于ffmpeg實(shí)現(xiàn)的,同樣的實(shí)驗(yàn)獲取視頻幀信息的速度在1秒左右,只開了一個線程,ffmpeg還是依舊的強(qiáng)大啊。
通過本周的學(xué)習(xí),自己對于ffmpeg是越來越趕興趣了,所以買了一本書來研究一下,但是本書講的都是c語言,所以沒辦法又把我大學(xué)學(xué)習(xí)的c語言的書找了出來,繼續(xù)開始著自己的爬坑之旅。
讀數(shù)據(jù)庫。Android中所有的多媒體文件除了存儲在物理硬盤上,還會將文件信息(路徑、id、類型、)保存到數(shù)據(jù)庫中,這樣當(dāng)我們想要獲取這些文件的信息時,就不需要耗時的掃描硬盤,只需要讀數(shù)據(jù)庫就可以了。Android平臺中稱手機(jī)終端內(nèi)存為內(nèi)部存儲空間,稱SD卡為外部存儲空間。針對內(nèi)部和外部存儲空間中的媒體文件信息是分開管理的,各自有獨(dú)立的數(shù)據(jù)庫管理。外部存儲空間和內(nèi)部存儲空間對應(yīng)的卷標(biāo)為”external”和”internal”。
前段時間在做視頻播放器的時候碰到一個新需求:需要將視頻的地理位置顯示在視頻的詳情里面。第一反應(yīng)就是每一個視頻文件都可以記錄下來一些信息,這些信息里面包含了經(jīng)緯度等等,就像照片的ExifInterface類一樣。于是就去查看了MediaRecorder類,便發(fā)現(xiàn)了這個類里面有public void setLocation(float latitude, float longitude)這么個方法可以給錄制的視頻設(shè)置經(jīng)緯度。
所以說明視頻文件里面是存儲了經(jīng)緯度的,現(xiàn)在的關(guān)鍵就是找到對應(yīng)的API去獲取視頻文件存儲的經(jīng)緯度?;貞浺郧矮@取視頻的某一幀圖像使用的是MediaMetadataRetriever類,通過這個對象是否也可以獲取一些別的信息呢?創(chuàng)建mediaMetadataRetriever對象后發(fā)現(xiàn)了這么個方法:mediaMetadataRetriever.extractMetadata(int keyCode);看見這個方法名就感覺找到了(提煉出元數(shù)據(jù)),現(xiàn)在還需要一個關(guān)鍵的keyCode。于是進(jìn)入到這個類里面瀏覽源碼,發(fā)現(xiàn)了一大堆的key:
這里我所需要的僅僅是:public static final int METADATA_KEY_LOCATION = 23;
返回的經(jīng)緯度格式:+22.000+119.999,這里需要將經(jīng)度部分和緯度部分分割開來。
最后通過Geocoder解析出經(jīng)緯度對應(yīng)的具體城市位置:
一部分手機(jī)將eMMC存儲掛載到 /mnt/external_sd 、/mnt/sdcard2 等節(jié)點(diǎn),而將外置的SD卡掛載到Environment.getExternalStorageDirectory()這個結(jié)點(diǎn),此時,調(diào)用Environment.getExternalStorageDirectory(),則返回外置的SD的路徑。
而另一部分手機(jī)直接將eMMC存儲掛載在Environment.getExternalStorageDirectory()這個節(jié)點(diǎn),而將真正的外置SD卡掛載到/mnt/external_sd、/mnt/sdcard2 等節(jié)點(diǎn)。此時,調(diào)用Environment.getExternalStorageDirectory(),則返回內(nèi)置的SD的路徑。
我們只說第一種情況,并且視頻文件在/Sdcard下面
String path = Environment.getExternalStorageDirectory().getPath() + "/文件所在子目錄/../你的文件名.*";
String path2 = "文件.*";
File file = new File("/sdcard/../文件.*");
//加載視頻:
VideoView videoView = (VideoView)findViewById(R.id.