web-dev-qa-db-ja.com

ハンドブレーキにキャプチャ時間/作成時間を維持させる方法は?

Handbrakeは素晴らしいビデオ圧縮ツールですが、ビデオが圧縮された後、元のキャプチャ時間を保持するようには見えません。これを修正する方法はありますか?

14
pixelfreak

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

構文の説明:

それを分解するために、これは次のことを行います:

  • 2つの入力ファイル(in.mp4およびout.mp4)、ID 0と1がそれぞれ割り当てられています。
  • ファイル1のビデオ/オーディオ/字幕ストリームのみを出力(-map 1)、すでに変換されたビットストリームを取得します
  • ファイル0のメタデータのみを出力(-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

ハンドブレーキ変換後のファイルは次のとおりです。

$ 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で行いたい場合:

実際には、とにかくハンドブレーキが依存しているFFmpegを使用できる場合は、ハンドブレーキを使用する必要はありません。最も単純なケースでは、次のように変換できます。

ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4

これにより、x264エンコーダーとAACオーディオによる入力が出力ファイルに変換され、元のメタデータがコピーされます。出力の品質を変更するには、次の方法があります。

  • ビデオのCRF値を変更します。低いほど品質が良いことを意味します。 23がデフォルトであり、18未満はおそらく視覚的にロスレスになります。
  • オーディオのビットレートを変更します。詳細については、 AACエンコーディングガイド を参照してください。

詳細については、FFmpeg wikiの x264エンコーディングガイド を参照してください。

21
slhck

残念ながら、ハンドブレーキはそれだけではそれを行うことができないようですが、ffmpegの例と同様に、touch unixコマンドを使用して、圧縮後にタイムスタンプをオリジナルからコピーできます。

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

これにより、圧縮ファイルのタイムスタンプが指定された参照ファイルと同じに設定されます。

5

Adapterと呼ばれる別のソフトウェアを使用して、これを行う簡単な方法を見つけました: http://www.macroplant.com/adapter/

HandBrakeのようなすべての高度な設定はありませんが、(ffmpegを使用して)機能し、必要なメタデータを保持します。

3
pixelfreak

私はmacOS Yosemiteと HandBrakeBatch を使用しています。これを使用してファイルを変換しますが、[環境設定]メニューの[ファイルの作成と変更の日付を保持する]ボックスをクリックします。

次に、ビデオをLightroom 5にインポートしますが、作成日はまだ保持されません。しかし、最も重要なのは、ファイルが正しい作成日でFinderに表示されることです。そのため、Lightroomライブラリでそれらすべてを選択しました→メタデータ(右のダイアログ列)→キャプチャ時間→ファイルの作成日に変更→すべて変更。

私は850の古い家族のビデオを持っていました–私はこのプロセスを100のバッチで実行しなければなりませんでした。ハンドブレーキは多くのファイルでクラッシュします。

2
Regis

上記のように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

1

ファイルレベルの変更時間を意味している場合は、同じ問題が発生し、 exiftool で回復できました。

exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4

これにより、メタデータとFileModifyDateinput.mp4から取得され、output.mp4にコピーされます。

トランスコードするファイルが多数あるため、これを自動化するために、最初に FFmpeg でトランスコードする Shrinkwrap というツールを作成しました(保存する必要があるため、HandBrakeから離れました)より多くのメタデータ)、exiftoolを使用して変更タイムスタンプを回復します。

1
bennetimo

多くの検索の後、新しいHandbrakeで圧縮されたビデオファイルの作成/変更された日付を上書きするために、正しい日付が作成/変更された古いビデオファイルを使用することをほとんどあきらめました。ほとんどの動画のファイル名には日付と時刻が含まれているため、実験して2つの方法で機能させました。最初のbestは、ファイル名自体だけでなく、ファイル名を変更、作成、アクセスする日付を変更できるAdvanced Renamerのタイムスタンプメソッドを使用することです。 https://www.advancedrenamer.com/download

私はまた、Powershellスクリプト https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ を見つけました。これは、プログラマが他のファイル名/日付に適合させることができますフォーマット。現在の状態では、ファイル名がその例のように正確に構造化されている場合にのみ機能します。

幸いなことに、ファイル名の日付が変更されていないビデオの数は十分に少ないので、手動で変更することができ、それほど長くはかかりません。

私はffmpegを使用してみましたが、そのmap_metadataコマンドは、ファイル自体の変更日ではなく、ファイル自体のデータのみを変更します。この種の内部メタデータHandbrakeは、とにかく既に問題ありません。

0
Eregos

非常に大きなGoPro MP4ビデオをH.264に圧縮する間、作成日を維持しようとします。

私はプログラム HandBrakeBatch を見つけました。これは、作成日(メタデータ)を維持しながら、1000ファイル以上を一度に圧縮するために必要なことです。

これを行うことができる他のプログラムを見つけていません。 FFmpeg、HandBrake、Wonderful Video Converterを試してみましたが、違います。

0
Jim

プログラム MyFFmpeg はこれを非常にうまく行います。そのオプションでは、ソースファイルから元の作成/変更日を保持するの選択肢があります。

Plexサーバーにホームビデオがあり、ファイルが作成日順に整理されているため、これを探していました。これは、特定の年のものを表示したい場合に非常に便利です。

残念ながら、これは無料のオプションではなく、現在20ユーロまたは約21 USドルかかります。ライセンスを購入する前に、10の試用版があります。無料のffmpeg GUIの一部には、このオプションがないか、追加されていないことに驚いています。

0
Houston