2014-03-27 90 views
4

我在有限的時間內錄製了視頻。現在我想要獲取所有視頻幀。我正在使用下面的代碼,並通過使用它我能夠得到框架,但我沒有得到所有的視頻幀。重複3到4幀,然後我得到了不同的幀。但正如我們都知道,我們可以在一秒鐘內獲得25-30幀,以顯示流暢的視頻。如何獲取所有框架。提取Android中的所有視頻幀

for (int i = 0; i < 30; i++) { 

        Bitmap bArray = mediaMetadataRetriever.getFrameAtTime(
          1000000 * i, 
          MediaMetadataRetriever.OPTION_CLOSEST); 

        savebitmap(bArray, 33333 * i); 

       } 

我不想使用NDK。我得到這個鏈接不知道「argb8888」應該是什麼值。我在這裏得到錯誤。任何人都可以解釋如何做到這一點。 Getting frames from Video Image in Android

+2

用'OPTION_CLOSEST'試試看看會發生什麼。 –

+0

+1您的寶貴答案。謝謝 –

+0

嘿有什麼成就? –

回答

1

你需要做的:

  1. 視頻解碼。
  2. 以至少24張圖像/秒的速度顯示解碼圖像。假設你可以跳過這一步,我想用 。
  3. 保存解碼圖像。

看來,解碼視頻將是最具挑戰性的一步。人們和公司花費數年時間爲各種視頻格式開發編解碼器(編碼器/解碼器)。

使用此圖書館JMF for FFMPEG

5

我之前面臨同樣的問題,Android的MediaMetadataRetriever似乎沒有用於這項任務,因爲它沒有很好的精度。 我使用了一種叫做 「FFmpegMediaMetadataRetriever」 在Android Studio中的庫:

  1. 在build.graddle加入這一項目下的模塊應用:

編譯「com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.1 '

  1. 重建您的項目。
  2. 使用FFmpegMediaMetadataRetriever類抓住以更高的精度幀:

    FFmpegMediaMetadataRetriever MED =新FFmpegMediaMetadataRetriever(); med.setDataSource(「您的數據源」);

,並在你的循環,你可以使用抓幀:

Bitmap bmp = med.getFrameAtTime(i*1000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); 
+0

我的循環結束索引是什麼?我怎麼能得到沒有捕獲的幀?我必須迭代循環直到捕獲幀的數量爲止 –

+0

方法「getFrameAtTime」的第一個參數是視頻時間軸中幀的位置,單位爲微秒(1秒= 1,000,000ms)。因此在那個特定的代碼中,我們在1秒的每次交互中獲得幀。所以我的循環限制可能是以秒爲單位的視頻長度。附:如果你想在更短的時間間隔內獲得幀(例如毫秒),你可以改變0的數量。 –

2

要想從視頻中我們可以使用ffmpeg.For在android系統集成的FFmpeg我們可以使用預編譯的庫,例如ffmpeg-android圖像幀。

要從視頻中提取的圖像幀,我們可以使用下面的命令

字符串[] complexCommand = { 「-y」, 「-i」,inputFileAbsolutePath, 「-an」, 「-R」 ,「1/2」,「-ss」,「」+ startMs/1000,「-t」,「」+(endMs-startMs) /1000,outputFileAbsolutePath};

這裏,

-y

覆蓋輸出文件

-i

FFMPEG從由-i選項指定的輸入的「文件」的任意數量的讀取

-an

禁用錄音。

-r

設定的幀速率

-ss

試圖定位

-t

限制從輸入文件中讀取數據的持續時間

這裏代替inputFileAbsolutePath,你必須指定要從中提取圖像的視頻文件的絕對路徑。

完整代碼請在我的資料庫中檢查this。內嵌extractImagesVideo()方法我正在運行從視頻中提取圖像的命令。

有關ffmpeg庫集成和使用ffmpeg命令編輯視頻的完整教程,請查看我在博客上撰寫的this文章。