2015-10-20 100 views
13

我已經在我的應用程序中記錄了一個來自攝像頭的視頻並保存在設備存儲中。現在我想顛倒視頻,使其從backwards.i.e播放。如果視頻爲10秒,則第10秒的最後一幀將成爲第一幀,並從那裏開始播放到第一幀第一幀。我想將反轉的視頻保存在一個文件中。我應該如何繼續?在Android中反轉視頻

+0

檢查這篇文章的真正有用的http://andrey.chernih.me/2014/06/28/video-recording-and-processing-in-android/ –

+0

@MohanadKholy其GUD文章。 。但我無法找到扭轉視頻的方法嗎? –

+0

這是不相關的android這是什麼有關的videolibrary可以扭轉你的視頻 – raj

回答

1

感謝米克給我一個想法,使用ffmpeg扭轉視頻。

我在github上發佈了代碼,用於反轉視頻以及使用ffmpeg執行其他視頻編輯操作並在我的博客文章here中完成教程。

寫在我的博客文章,

對於倒車影像,首先我們需要將視頻分割成段10秒或更少 時間,因爲 ffmpeg的倒車影像命令不會持續時間長的工作除非您的設備具有32 GB的RAM。

因此,以逆轉video-

1.Divide視頻與的10秒或更少的持續時間段。

2.Reverse分段的視頻

3.Concatenate以相反的順序反轉分割的視頻。

用於將視頻分成段以6秒的持續時間,我們可以使用 以下命令 -

字符串[] complexCommand = { 「-i」,inputFileAbsolutePath, 「-c:V」, 「libx264 「-crf」「22」「-map」「0」「-segment_time」「6」「-g」「9」 「-sc_threshold」,「0」,「 - 」 force_key_frames「,」expr:gte(t,n_forced * 6)「, 」-f「,」segment「,outputFileAbsolutePath};

這裏,

-c:v libx264

編碼與libx264

-crf

中設置恆定質量模式下的質量所有視頻流。

-segment_time

時間的視頻的每個分段

-g

GOP大小

-sc_threshold

組場景變化閾值。

-force_key_frames EXPR:GTE(T,n_forced * N)

強制一個關鍵幀每隔n秒

分割視頻後,我們需要扭轉分段videos.For ,我們需要運行循環其中每個分段視頻文件將逆轉爲 。

爲了逆轉與音頻的視頻(不除去它的音頻),我們可以使用 的命令 -

字符串命令下面[] = { 「-i」,inputFileAbsolutePath, 「-vf」, 「反向」 , 「-af」,「areverse」,outputFileAbsolutePath};

爲了逆轉與音頻除去其音頻我們可以使用下面 命令 -

字符串命令[] = { 「-i」,inputFileAbsolutePath, 「-an」, 「-vf」 的視頻, 「reverse」,outputFileAbsolutePath};

要反轉視頻,而無需音頻我們可以使用命令 -

字符串命令下面[] = { 「-i」,inputFileAbsolutePath, 「-vf」, 「反向」, outputFileAbsolutePath};

倒車分段錄像之後,我們需要連接顛倒反轉order.For 分段錄像,我們的視頻最後修改文件的基礎上 使用Arrays.sort(文件進行排序, LastModifiedFileComparator。LASTMODIFIED_REVERSE)。

然後,以連接反向分段視頻(音頻),我們可以使用下面的 命令 -

字符串命令[] = { 「-i」,inputFile1AbsolutePath, 「 - 我」,inputFile2AbsolutePath 。 ...,「 - i」,inputFileNAbsolutePath,「 - filter_complex」,「[0:v0] [0:a0] [1:v1] [1:a1] ... [N:vN] concat = n = N:v = 1:A = 1 [v] [A], 「 - 映射」, 「[v]的」, 「 - 映射」, 「[A]」,outputFileAbsolutePath};

要連接反轉分段視頻(無音頻),我們可以使用下面的 命令 -

字符串命令[] = { 「-i」,inputFile1AbsolutePath, 「 - 我」,inputFile2AbsolutePath ....., 「 - 我」,inputFileNAbsolutePath, 「 - filter_complex」,「[0 :0] [1:0] [2:0] ... [N:0] concat = n = N:v = 1:a = 0「,outputFileAbsolutePath};

這裏,

-filter_complex [0:V0] [0:A0] [1:V1] [1:A1] ... [N:VN]告訴FFmpeg什麼流發送到CONCAT過濾器。在上述情況下,來自輸入端0的視頻流 [0:v0]和音頻流0 [0:a0],來自輸入端1的視頻流1 [1:v1] 和音頻流1 [1:v1]上。

的concat濾波器用來連接的音頻和視頻流,則other.The過濾器之後接合 在一起一個接受以下 選項:

Ñ

設置的段的數量。默認值是2

v

設置輸出視頻流的數目,這也是在各區間 視頻流的數量。默認值爲1。

一個

設置輸出音頻流的數目,這也是在各區間 音頻流的數量。默認值爲0。

+0

如果我的解決方案的性能如何可能會問。因爲上次我在android上修改ffmpeg,性能不是很好。操縱15秒視頻需要花費50秒,即使我可以找到所有的優化。 –

+0

@ vxh.viet翻轉視頻的過程確實需要一些時間.FFmpeg提供了某些預設,它們是爲過程提供特定速度的選項集合。 Utrafast預設特別有助於加速進程。要使用預設,只需在命令中添加「-preset」,「ultrafast」。請查看[here](https://trac.ffmpeg.org/wiki/Encode/H .264)有關選擇預設的詳細說明。同時建議使用您有耐心的最慢預設。 –

6

如果你準備使用的ffmpeg您可以使用此方法 - 它本質上打破了視頻到幀,然後以相反的順序重新構建它:

有幾種方法在Android中使用ffmpeg,但'包裝'方法是我找到了性能和易用性的合理組合。一些例如Android的ffmpeg的包裝:

值得意識到,這將是耗時的移動 - 如果你有能上傳到奢侈品服務器,並在那裏做逆轉可能會更快。

+0

以前我用這個依賴'compile'c​​om.github.hiteshsondhi88.libffmpeg:FFmpegAndroid:0.2.5''來擦洗視頻..我應該繼續使用這種依賴性來倒車視頻嗎? –

+0

從理論上講,如果一個命令可以工作,那麼任何命令都可以工作,但值得記住的是ffmpeg實際上並沒有設計成這樣包裝,所以我不認爲沒有測試就可以100%確定。如果它適合你擦洗,我會從那裏開始,因爲它有很好的可能性。有一件事要注意 - 如果你需要音頻反轉也(由於某種原因...),那麼上述方法使用「sox」這是一個單獨的實用程序。上面的監護人鏈接包括sox,儘管我沒有親自使用它。 – Mick

+0

謝謝..我可以如何在我的android項目中集成sox實用程序? –