Bagaimana membuat Handbrake menghemat waktu tangkap / waktu pembuatan?

14

Handbrake adalah alat kompresi video yang luar biasa, tetapi sepertinya tidak mempertahankan waktu pengambilan asli setelah video dikompresi. Adakah cara untuk memperbaikinya?

pixelfreak
sumber
@ Slhck Ya maksud saya Waktu Pembuatan. Saya menggunakan Lightroom untuk mengelola video saya dan setelah kompresi, waktu Tangkapan / Pembuatan menjadi Waktu yang Dimodifikasi.
pixelfreak

Jawaban:

21

Anda dapat menyalin metadata yang ada dari satu file ke file lain tanpa perlu menyandikan ulang video menggunakan FFmpeg . Ini pada dasarnya membutuhkan satu detik. Untuk melakukan ini, mari kita asumsikan tiga file:

  • in.mp4 - file asli sebelum konversi
  • out.mp4 - file setelah konversi Handbrake
  • fixed.mp4 - file dengan metadata "dikoreksi"

Perintah FFmpeg untuk menyalin catatan metadata lengkap ke file baru akan menjadi:

ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4

Penjelasan sintaksis:

Untuk memecahnya, ini melakukan hal berikut:

  • Ambil dua file input ( in.mp4dan out.mp4), yang masing-masing diberi ID 0 dan 1.
  • Hanya memetakan stream video / audio / subtitle dari file 1 ke output ( -map 1), jadi kami mengambil bitstream yang sudah dikonversi
  • Hanya memetakan metadata dari file 0 ke output ( -map_metadata 0)
  • Gunakan salin codec ( -c copy) untuk menyalin semua aliran bit alih-alih menyandikan ulang video.

Setelah itu, Anda dapat dengan jelas mengganti nama fixed.mp4menjadi out.mp4.


Bukti:

Sebagai contoh, inilah bagian dari catatan metadata dari file asli saya:

$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19

Ini file setelah konversi Handbrake:

$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35

Ini file terakhir setelah memetakan metadata:

$ 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    

Jika Anda ingin melakukan semuanya dengan FFmpeg:

Sebenarnya, Anda tidak benar-benar perlu menggunakan Handbrake jika Anda dapat menggunakan FFmpeg, yang menjadi sandaran Handbrake. Dalam kasus paling sederhana, Anda dapat melakukan konversi seperti ini:

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

Ini akan mengonversi input dengan encoder x264 dan audio AAC ke file output, menyalin metadata asli. Untuk mengubah kualitas output, Anda dapat:

  • Ubah nilai CRF untuk video. Lebih rendah berarti kualitas yang lebih baik. 23 adalah default, dan apa pun di bawah 18 mungkin akan hilang secara visual.
  • Ubah bitrate untuk audio. Lihat panduan pengodean AAC untuk info lebih lanjut.

Baca panduan penyandian x264 di wiki FFmpeg untuk informasi lebih lanjut.

slhck
sumber
1
Wow, itu solusinya keren, terlihat agak menakutkan, saya berharap Handbrake melakukan ini di belakang layar. Terima kasih!
pixelfreak
Perintah transfer metadata berfungsi, tetapi perintah terakhir untuk melakukan konversi juga memberi saya Unknown encoder 'libfaac'kesalahan
pixelfreak
Maka ffmpeg Anda tidak dikompilasi dengan dukungan FAAC. Coba -c:a aac -strict experimentalsaja.
slhck
5

Sayangnya sepertinya rem tangan tidak dapat melakukannya sendiri, tetapi mirip dengan contoh ffmpeg, cap waktu dapat disalin dari aslinya setelah kompresi dengan menggunakan touchperintah unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

ini akan mengatur timestamp pada file terkompresi menjadi sama dengan file referensi yang diberikan.

André Fernandes
sumber
1
Ini akan mengatur timestamp untuk file, ya, tetapi hanya di sistem file. Data EXIF ​​tidak akan memiliki cap waktu "Tanggal / Waktu Asli" yang benar.
Stephen Schrauger
3

Saya menemukan cara yang lebih mudah untuk melakukan ini, menggunakan perangkat lunak berbeda bernama Adapter: http://www.macroplant.com/adapter/

Itu tidak memiliki semua pengaturan lanjutan seperti HandBrake tetapi melakukan pekerjaan (juga menggunakan ffmpeg) dan mempertahankan metadata yang saya butuhkan.

pixelfreak
sumber
1
Saya tidak berpikir Adaptor dapat melakukan ini. Saya baru saja menguji versi terbaru dan tidak dapat menemukan pengaturan untuk mempertahankan metadata di mana saja. Selain itu, tampaknya tidak mengkonversi semua jenis file video, seperti MTS, dll.
jjj
Sayang sekali itu tidak kompatibel dengan format m2ts sony
Diego Vieira
2

Saya menggunakan macOS Yosemite dan HandBrakeBatch - menggunakannya untuk mengonversi file, tetapi klik pada kotak "simpan tanggal pembuatan dan modifikasi file" di menu "Preferences".

Lalu, saya mengimpor video ke Lightroom 5, tetapi mereka masih tidak menyimpan tanggal pembuatannya. Tetapi, yang paling penting, file-file tersebut ditampilkan di Finder dengan tanggal pembuatan yang benar. Jadi saya memilih mereka semua di perpustakaan Lightroom → Metadata (kolom dialog kanan) → Capture Time → Ubah ke tanggal pembuatan File → Ubah Semua.

Saya memiliki 850 video keluarga lama - saya harus melakukan proses ini dalam batch 100. Handbrake crash dengan banyak file.

Regis
sumber
Nice find, bisa melihat diriku menggunakan aplikasi ini banyak.
calum_b
Perhatikan bahwa aplikasi tidak lagi dipertahankan : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
1

Saya membuat skrip bash yang dapat mentransfer metadata, menggunakan touchseperti yang disarankan di atas. Agar berfungsi, Anda harus memiliki file asli dan yang dikonversi pada direktori terpisah, masing-masing dengan jumlah file yang sama (direktori hanya boleh memiliki file video, karena file / direktori lain akan mengganggu) dan dalam urutan yang sama. Kemudian itu hanya menyalin metadata dan Anda sudah siap dan selesai. Skrip mencantumkan semua pasangan file sehingga Anda dapat memeriksa kesalahan pada akhirnya jika Anda mau.

Kode ini mungkin bukan yang paling rapi karena ini adalah skrip bash pertama saya yang tepat, tetapi sudah cukup cepat dan stabil untuk saya, jadi begini:

#!/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

Untuk menjalankan lakukan: sudo bash script.sh /sourcedir /converteddir

António Bezerra
sumber
1

Jika Anda maksud waktu modifikasi tingkat file, maka saya memiliki masalah yang sama, dan dapat memulihkannya dengan exiftool .

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

Ini mengambil metadata dan FileModifyDatedari input.mp4dan menyalinnya ke output.mp4.

Untuk mengotomatisasi ini karena saya memiliki banyak file untuk transcode, saya membuat alat yang disebut Shrinkwrap yang pertama kali mentranskode dengan FFmpeg (saya pindah dari HandBrake karena perlu menyimpan lebih banyak metadata), kemudian memulihkan stempel waktu modifikasi dengan exiftool.

bennetimo
sumber
0

Setelah banyak pencarian, saya kebanyakan menyerah menggunakan file video lama dengan tanggal yang benar dibuat / dimodifikasi untuk menimpa tanggal yang dibuat / dimodifikasi dari file video baru saya yang dikompresi dengan rem tangan. Karena sebagian besar video saya memiliki tanggal / waktu dalam nama file, saya bereksperimen dan mendapat dua metode untuk bekerja. Yang pertama dan terbaik adalah menggunakan metode cap waktu Advanced Renamer, yang BISA mengubah tanggal file yang dimodifikasi, dibuat, dan diakses, bukan hanya nama file itu sendiri. https://www.advancedrenamer.com/download .

Saya juga menemukan skrip powershell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ yang dapat diadaptasi oleh programmer untuk format nama file / tanggal lainnya. Dalam kondisi saat ini, ia hanya berfungsi jika nama file disusun persis seperti pada contoh itu.

Untungnya jumlah video saya tanpa tanggal yang diubah dalam nama file cukup rendah. Saya dapat mengubahnya secara manual, tidak akan terlalu lama.

Saya mencoba menggunakan ffmpeg, tetapi perintah map_metadata hanya mengubah data di dalam file, bukan tanggal yang dimodifikasi, dibuat dari file itu sendiri. Handbrake internal semacam itu sudah baik-baik saja.

Eregos
sumber
0

Program MyFFmpeg melakukan ini dengan sangat baik. Dalam opsinya ada pilihan untuk Menjaga Penciptaan Asli / Tanggal Dimodifikasi dari File Sumber .

Saya telah mencari ini karena saya memiliki video rumah saya di server Plex dan file-file tersebut diatur berdasarkan tanggal pembuatan, yang sangat berguna jika Anda ingin melihat barang-barang dari tahun tertentu.

Sayangnya ini bukan opsi gratis, saat ini harganya 20 euro atau sekitar 21 US. Mereka memiliki percobaan untuk 10 penggunaan sebelum Anda harus membeli lisensi. Terkejut, beberapa GUI ffmpeg gratis tidak memiliki atau menambahkan opsi ini.

Houston
sumber
0

Saya mencoba mempertahankan tanggal pembuatan sementara saya mengompres video GoPro MP4 saya yang sangat besar ke H.264.

Saya menemukan program HandBrakeBatch . Persis seperti yang saya perlukan untuk mengkompres lebih dari 1000 file dalam sekali jalan, sambil menjaga tanggal pembuatan (metadata).

Belum menemukan program lain yang dapat melakukan ini. Sudah mencoba FFmpeg, HandBrake, dan Wonderful Video Converter, tetapi tidak.

Jim
sumber
Perhatikan bahwa HandBrakeBatch tidak lagi dipertahankan : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck