回答:
FFmpegを使用してビデオを再エンコードする必要なく、あるファイルから別のファイルに既存のメタデータをコピーできます。基本的に1秒かかります。これを行うために、3つのファイルを想定します。
in.mp4
–変換前の元のファイルout.mp4
–ハンドブレーキ変換後のファイルfixed.mp4
–「修正された」メタデータを持つファイル完全なメタデータレコードを新しいファイルにコピーするFFmpegコマンドは次のようになります。
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
これを分解するために、これは次のことを行います。
in.mp4
とout.mp4
)を取得します。-map 1
)にマッピングします。そのため、既に変換されたビットストリームを取得します-map_metadata 0
)-c copy
ビデオを再エンコードする代わりに、コピーコーデック()を使用してすべてのビットストリームをコピーします。その後、明らかにに名前fixed.mp4
を変更できますout.mp4
。
例として、元のファイルのメタデータレコードの一部を次に示します。
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
Handbrake変換後のファイルは次のとおりです。
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
メタデータをマッピングした後の最終ファイルは次のとおりです。
$ ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
[…]
$ mediainfo fixed.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
実際、FFmpegを使用できるのであれば、Handbrakeを使用する必要はありません。FFmpegはとにかく依存しています。最も単純なケースでは、次のように変換を行うことができます。
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
これにより、x264エンコーダーとAACオーディオを使用して入力が出力ファイルに変換され、元のメタデータがコピーされます。出力の品質を変更するには、次のことができます。
詳細については、FFmpeg wiki のx264エンコーディングガイドを参照してください。
Unknown encoder 'libfaac'
エラーが発生しました
-c:a aac -strict experimental
代わりに試してください。
残念ながら、ハンドブレーキはそれだけではできませんが、ffmpegの例と同様に、touch
unixコマンドを使用して、圧縮後にタイムスタンプをオリジナルからコピーできます。
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
これにより、圧縮ファイルのタイムスタンプが指定の参照ファイルと同じに設定されます。
私はと呼ばれる別のソフトウェアを使用して、これを行うための簡単な方法を見つけましたAdapter
:http://www.macroplant.com/adapter/
HandBrakeのような高度な設定がすべてあるわけではありませんが、仕事も(ffmpegを使用して)行い、必要なメタデータを保持します。
macOS YosemiteとHandBrakeBatchを使用しています。これを使用してファイルを変換しますが、[設定]メニューの[ファイルの作成日と変更日を保持する]ボックスをクリックします。
次に、ビデオをLightroom 5にインポートしますが、作成日は保持されません。ただし、最も重要なのは、ファイルが正しい作成日でFinderに表示されることです。そのため、Lightroomライブラリですべてを選択しました→メタデータ(右のダイアログ列)→キャプチャ時間→ファイルの作成日に変更→すべて変更。
私は850の古い家族のビデオを持っていました–私は100のバッチでこのプロセスをしなければなりませんでした。多くのファイルでHandbrakeがクラッシュします。
touch
上記の提案に従って、メタデータをバッチ転送できるbashスクリプトを作成しました。それが機能するためには、元のファイルと変換されたファイルを別々のディレクトリに配置し、それぞれが同じ数のファイル(他のファイル/ディレクトリが干渉するため、ディレクトリにはビデオファイルのみが必要)を同じ順序で持つ必要があります。次に、メタデータをコピーするだけで、設定は完了です。スクリプトにはすべてのファイルのペアがリストされるため、必要に応じて最後にエラーをチェックできます。
このコードは私の最初の適切なbashスクリプトであるため、最も適切ではないかもしれませんが、私にとっては非常に高速で安定しているので、ここに行きます。
#!/bin/bash
#Sets IFS to \n to allow for filenames with spaces
IFS=$'\n'
#Source directory and converted direcotry
dir1=$1
dir2=$2
#Array with source filepaths
srcf=()
#Array with converted filepaths
cnvf=()
#Adds filepaths from the source directory to srcf array
for file in $(ls -1 $dir1); do
srcf+=("$dir1/$file")
done
#Adds filepaths from the converted directory to cnvf array
for file in $(ls -1 $dir2); do
cnvf+=("$dir2/$file")
done
#Checks if source and convert folders have the same number of files
if [ ${#srcf[*]} -eq ${#cnvf[*]} ]
then
#Counter variable
fnum=0
#Loops through the arrays and runs touch command on pairs of files to transfer the metadata
while [ $fnum -lt ${#srcf[*]} ]; do
echo $fnum
echo ${srcf[$fnum]} ${cnvf[$fnum]}
touch -r ${srcf[$fnum]} ${cnvf[$fnum]}
((fnum++))
done
else
echo "The provided paths do not have the same number of files. Both paths must have the same number of files in the same order."
fi
実行するには: sudo bash script.sh /sourcedir /converteddir
ファイルレベルの変更時間を意味する場合、私は同じ問題を抱えていて、exiftoolでそれを回復することができました。
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
これは、メタデータを取得してFileModifyDate
からinput.mp4
、それをコピーoutput.mp4
。
トランスコードするファイルが多数あるため、これを自動化するために、最初にFFmpegでトランスコードするShrinkwrapというツールを作成し(メタデータをさらに保持する必要があるためHandBrakeから離れました)、exiftoolで変更タイムスタンプを回復します。
多くの検索を行った後、新しいハンドブレーキで圧縮されたビデオファイルの作成/変更された日付を上書きするために、正しい日付が作成/変更された古いビデオファイルの使用をほとんどあきらめました。ほとんどのビデオではファイル名に日付/時刻が含まれているため、2つの方法を試してみました。最初の最善の方法は、Advanced Renamerのタイムスタンプメソッドを使用することです。これは、ファイル名だけでなく、変更、作成、およびアクセスされたファイルの日付を変更できます。https://www.advancedrenamer.com/download。
また、プログラマが他のファイル名/日付形式に適合させることができるPowerShellスクリプトhttps://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/を見つけました。現在の状態では、ファイル名がその例のとおりに正確に構成されている場合にのみ機能します。
幸いなことに、ファイル名に日付が変更されていない私のビデオの数は十分に少ないので、それらを手動で変更できます。それほど長くかかりません。
ffmpegを使用してみましたが、map_metadataコマンドはファイル内のデータのみを変更し、ファイル自体の変更日、作成日は変更しません。とにかく、この種の内部メタデータHandbrakeはすでにうまく機能しています。
非常に大きなGoPro MP4ビデオをH.264に圧縮している間、作成日を維持しようとしています。
HandBrakeBatchというプログラムを見つけました。作成日(メタデータ)を維持しながら、一度に1000以上のファイルを圧縮するために必要なものです。
これを行うことができる他のプログラムを見つけていません。FFmpeg、HandBrake、Wonderful Video Converterを試しましたが、ありません。