Handbrake adalah alat kompresi video yang luar biasa, tetapi sepertinya tidak mempertahankan waktu pengambilan asli setelah video dikompresi. Adakah cara untuk memperbaikinya?
Handbrake adalah alat kompresi video yang luar biasa, tetapi sepertinya tidak mempertahankan waktu pengambilan asli setelah video dikompresi. Adakah cara untuk memperbaikinya?
Jawaban:
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 konversiout.mp4
- file setelah konversi Handbrakefixed.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
Untuk memecahnya, ini melakukan hal berikut:
in.mp4
dan out.mp4
), yang masing-masing diberi ID 0 dan 1.-map 1
), jadi kami mengambil bitstream yang sudah dikonversi-map_metadata 0
)-c copy
) untuk menyalin semua aliran bit alih-alih menyandikan ulang video.Setelah itu, Anda dapat dengan jelas mengganti nama fixed.mp4
menjadi out.mp4
.
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
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:
Baca panduan penyandian x264 di wiki FFmpeg untuk informasi lebih lanjut.
Unknown encoder 'libfaac'
kesalahan
-c:a aac -strict experimental
saja.
Sayangnya sepertinya rem tangan tidak dapat melakukannya sendiri, tetapi mirip dengan contoh ffmpeg, cap waktu dapat disalin dari aslinya setelah kompresi dengan menggunakan touch
perintah unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
ini akan mengatur timestamp pada file terkompresi menjadi sama dengan file referensi yang diberikan.
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.
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.
Saya membuat skrip bash yang dapat mentransfer metadata, menggunakan touch
seperti 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
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 FileModifyDate
dari input.mp4
dan 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.
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.
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.
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.