web-dev-qa-db-ja.com

android

アプリでカメラからのビデオを録画し、デバイスストレージに保存しました。次に、ビデオを逆にして、逆方向から再生するようにします。ビデオが10秒の場合、10秒の最後のフレームが最初のフレームになり、そこから1秒の最初のフレームまで再生を開始します。反転したビデオをファイルに保存したいのですが、どうすればよいですか?

13

ビデオを反転させるためにffmpegを使用するアイデアを与えてくれたMickに感謝します。

github にコードを投稿し、ffmpegを使用して他のビデオ編集操作を実行するとともに、ビデオを反転させ、ブログ投稿 here にチュートリアルを完了しました。

私のブログ投稿に書かれているように、

ビデオを反転するには、最初にビデオを10秒以下のセグメントに分割する必要があります。これは、デバイスに32 GBのRAMがない限り、ffmpegの逆ビデオコマンドは長時間のビデオでは機能しないためです。

したがって、ビデオを反転するには-

1.ビデオを10秒以下の長さのセグメントに分割します。

2.セグメント化されたビデオを反転します

3.逆にセグメント化されたビデオを逆の順序で連結します。

ビデオを6秒間のセグメントに分割するには、次のコマンドを使用できます-

String [] 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" 、 "セグメント"、outputFileAbsolutePath};

ここに、

-c:v libx264

libx264ですべてのビデオストリームをエンコードします

-crf

定品質モードの品質を設定します。

-segment_time

ビデオの各セグメントの時間

-g

GOPサイズ

-sc_threshold

シーン変更のしきい値を設定します。

-force_key_frames expr:gte(t、n_forced * n)

N秒ごとにキーフレームを強制する

ビデオをセグメント化した後、セグメント化されたビデオを反転する必要があります。そのために、セグメント化された各ビデオファイルが反転されるループを実行する必要があります。

音声付きのビデオを(音声を削除せずに)反転するには、次のコマンドを使用できます-

String command [] = {"-i"、inputFileAbsolutePath、 "-vf"、 "reverse"、 "-af"、 "areverse"、outputFileAbsolutePath};

オーディオを削除してビデオを反転するには、次のコマンドを使用できます-

String command [] = {"-i"、inputFileAbsolutePath、 "-an"、 "-vf"、 "reverse"、outputFileAbsolutePath};

音声なしでビデオを反転するには、以下のコマンドを使用できます-

String command [] = {"-i"、inputFileAbsolutePath、 "-vf"、 "reverse"、outputFileAbsolutePath};

セグメント化されたビデオを反転した後、反転されたセグメント化されたビデオを逆の順序で連結する必要があります。そのために、Arrays.sort(files、LastModifiedFileComparator.LASTMODIFIED_REVERSE)を使用して、最後に変更されたファイルに基づいてビデオを並べ替えます。

次に、逆にセグメント化されたビデオ(オーディオ付き)を連結するには、次のコマンドを使用できます-

String command [] = {"-i"、inputFile1AbsolutePath、 "-i"、inputFile2AbsolutePath .....、 "-i"、inputFileNAbsolutePath、 "-filter_complex"、 "[0: v0] [0:a0] [1:v1] [1:a1] ... [N:vN] concat = n = N:v = 1:a = 1 [v] [a]、 "-map"、 "[v]"、 "-map"、 "[a]"、outputFileAbsolutePath};

逆にセグメント化されたビデオ(オーディオなし)を連結するには、次のコマンドを使用できます-

String command [] = {"-i"、inputFile1AbsolutePath、 "-i"、inputFile2AbsolutePath .....、 "-i"、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]は、どのストリームをconcatフィルターに送信するかをffmpegに指示します。上記の場合、ビデオストリーム0 [0: v0]と入力0からのオーディオストリーム0 [0:a0]、入力1からのビデオストリーム1 [1:v1]とオーディオストリーム1 [1:v1]など。

concatフィルターは、オーディオストリームとビデオストリームを連結し、それらを次々に結合するために使用されます。フィルターは、次のオプションを受け入れます。

n

セグメント数を設定します。デフォルトは2です。

v

出力ビデオストリームの数、つまり各セグメントのビデオストリームの数を設定します。デフォルトは1です。

a

出力オーディオストリームの数、つまり各セグメントのオーディオストリームの数を設定します。デフォルトは0です。

3

Ffmpegを使用する準備ができている場合は、このアプローチを使用できます。基本的に、ビデオをフレームに分割してから、逆の順序で再構築します。

Androidでffmpegを使用する方法はいくつかありますが、「ラッパー」アプローチは、パフォーマンスと使いやすさの合理的なブレンドを見つけたものです。いくつかの例Android ffmpegラッパー:

これはモバイルでは時間がかかることを知っておく価値があります-サーバーにアップロードしてそこで元に戻すことができるという贅沢があれば、もっと速くなるかもしれません。

6
Mick