3000以上のh.264ビデオをバッチローテーションする最良の方法は?


8

私は約3000の短いビデオクリップを持っています。それぞれの所要時間は約3秒です。それぞれ90度回転させる必要があります。これを行う最良の方法は何ですか?私はAdobe Creative Cloudサブスクリプションを持っているだけでなく、WindowsマシンとMacマシンの両方にアクセスできます。非常に多くのビデオのローテーションを自動化/バッチ処理する最も簡単なソリューションを探しています。

疑問に思っていた場合-ビデオは材木のeラーニングコースの一部です。学習者は、ランダムに選択された各ビデオを表示します。これは、回転する木材の短いクリップです。ビデオは、材木(2x4など)が水平になるように撮影されました。しかし、クライアントは材木がクリップ内で垂直になることを望んでいます。


回転だけ?たとえば1280x720から720x1280に変更しますか?
p2または2015

時計回りに90度回転するだけです(または反時計回り-このプロジェクトでは関係ありません)。
user172586 2015

ビデオファイルのコンテナーに「向き」メタデータが含まれていますか?
audionuma 2015

回答:


9

「貧しい」が示唆するようにffmpeg「転置」フィルターを使用してください。たとえば、ファイルがmp4で、現在のディレクトリにある場合:

mkdir -p rotated
for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" rotated/"$f"; done
  • 転置の値は、時計回りの回転の場合は「1」または「時計」、反時計回りの回転の場合は「2」または「時計」になります。フリップを適用する他の値があります。

  • 不要な再エンコードを避けるために、オーディオはストリームコピーされます。

  • この例では、ビデオストリームローテーションメタデータがクリアされています。それ以外の場合ffmpegは、入力から出力にそれをコピーして、このメタデータに注意を払うプレーヤーの回転が不正確になります(あるものとないもの)。

別の例では、より冗長で柔軟性があり、ローテーションされたファイルを同じ名前で新しいディレクトリに保持します。

ext=mp4
for f in /some/dir/*.$ext; do
    new=${f/%.$ext/-rotated.$ext};
    ffmpeg -i "$f" -vf transpose=2 -c:a copy -metadata:s:v rotate="" "$new"
done

はい!私はbashスクリプトについてもっと学ぶ必要があります:)
p2or '24

1

多数のビデオに取り組むことに関心があると指定しました。マルチコアマシンを使用していforて、シェルによって提供される通常のループを使用する場合、コアの1つが高温になり、他のコアはまったく何もしません。これは理想的ではありません

このようなジョブに対して実行する必要があるのはparallel、複数のジョブを一度に開始できるツールであるfor を使用することです。これにより、forループが実行できるすべてのことを実行できますが、より優れています。

このツールのすべての機能については説明しませんが、特定のタスクに集中します。

これらすべてのジョブを開始する1つの方法は次のとおりです。

parallel avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

ここで{}は、各ファイル名を{.}置き換え、拡張子なしのファイル名を置き換えます。

コアと同じ数のジョブを開始し、1つを削除することをお勧めします。その理由は、オペレーティングシステムが引き続き使用可能であり、ハードディスク暗号化(データの読み取り/書き込みに処理能力を使用する)を使用している場合に備えて、これも節約できるためです。これを行うには--jobs -1、コマンドラインに追加するだけで、ジョブの数を制限できます。

parallel --jobs -1 avconv -i "{}" -vf transpose=2 "{.}[rotated].mp4" ::: *.mp4

各エンコードが完了するまで、出力は提供されないことに注意してください。そのため、各ビデオがどれだけ行われたかはわかりません。


1

この回答に基づいて、次のコマンドでffmpegを使用してビデオを回転できます。

ffmpeg -i input -vf transpose=2 output

映画のフォルダーをバッチ処理するには、選択したプログラミング言語を使用して、ファイルを反復処理できます。ここでは、Python 2.7以降のLinuxを使用しました。folder_moviesパスを編集してpath_to_ffmpeg、ムービーを設定するだけですextension

import os # import os module
import subprocess # import subprocess module

# set the path to your video folder
folder_movies = '/home/user/Desktop/test/'

# set ffmpeg path
path_to_ffmpeg = "/opt/ffmpeg/ffmpeg"

# set file extension
ext = ".mp4"

# collect all videos in folder_movies
movie_files = [f for f in os.listdir(folder_movies) if f.endswith(ext)] 

# iterate through the files
for i in movie_files:

    # setup correct filepath for mov's
    file_path = os.path.join(folder_movies,i)

    # generate new file path
    new_path = os.path.splitext(file_path)[0] + '_rotated_90' + ext

    # call ffmpeg with the correct arguments
    # command: ffmpeg -i input -vf transpose=2 output
    subprocess.call([path_to_ffmpeg, "-i",  file_path, "-vf", "transpose=2", "-c:a", "copy", new_path])

その後、ムービーフォルダは次のようになります。

ここに画像の説明を入力してください

Pythonを使用する利点は、コードがクロスプラットフォームで実行されることです。考慮する必要がある唯一のことは、ディレクトリへのパスとffmpeg実行可能ファイルです。これをWindowsマシンで実行するには、パスを次のようなものに置き換えるだけです。

# folder_movies = '/home/user/Desktop/test/' # linux or osx
folder_movies = r'c:\some\directory\test'    # windows, the r is important
folder_movies = 'c:/some/directory\test'     # windows (alternative)

# path_to_ffmpeg = '/opt/ffmpeg/ffmpeg'            # linux or osx
path_to_ffmpeg = r'c:\Program Files\ffmpeg\ffmpeg' # windows, the r is important
path_to_ffmpeg = 'c:/Program Files/ffmpeg\ffmpeg'  # windows (alternative)

注:私はffmpegのエキスパートではありません。直接バッチ処理する方法があるかもしれません。


1
このためのスクリプト全体は実際には必要ありません。MacまたはLinuxのコマンドラインで次のように直接実行できますmkdir -p rotated; for f in *.mp4; do ffmpeg -i "$f" -vf transpose=2 rotated/"$f"; done(この例では、ビデオファイルが.mp4であると想定しています)。
mivk 2015

@mivkいいですね、これを答えに変換してみませんか?
p2または2015

@mivk forループを使用しているため、ほとんど同じです。linuxやosxを使用しない人にとっては、pythonや他のスクリプト言語を使用することは理にかなっています。
p2または2015年

@poor:まあ、LinuxでもMacでもないユーザーの場合、PowerShellへの翻訳は「読者のための演習として残されます」... :-)
mivk

@mivkへへ、ええ、でも誰も使いたくない;)
p2または
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.