Handbrake là một công cụ nén video tuyệt vời, nhưng dường như nó không giữ được thời gian quay ban đầu sau khi video được nén. Bất kỳ ý tưởng làm thế nào để khắc phục điều này?
Handbrake là một công cụ nén video tuyệt vời, nhưng dường như nó không giữ được thời gian quay ban đầu sau khi video được nén. Bất kỳ ý tưởng làm thế nào để khắc phục điều này?
Câu trả lời:
Bạn có thể sao chép siêu dữ liệu hiện có từ tệp này sang tệp khác mà không cần mã hóa lại video bằng FFmpeg . Nó về cơ bản mất một giây. Để làm điều này, hãy giả sử ba tệp:
in.mp4
- tệp gốc trước khi chuyển đổiout.mp4
- tệp sau khi chuyển đổi Handbrakefixed.mp4
- tệp có siêu dữ liệu "đã sửa"Lệnh FFmpeg để sao chép bản ghi siêu dữ liệu hoàn chỉnh vào tệp mới sau đó sẽ là:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
Để phá vỡ nó, điều này làm như sau:
in.mp4
và out.mp4
), được gán ID tương ứng 0 và 1.-map 1
), vì vậy chúng tôi lấy các luồng bit đã được chuyển đổi-map_metadata 0
)-c copy
) để sao chép tất cả các dòng bit thay vì mã hóa lại video.Sau đó, rõ ràng bạn có thể đổi tên fixed.mp4
thành out.mp4
.
Ví dụ, đây là một phần của bản ghi siêu dữ liệu của tệp gốc của tôi:
$ mediainfo in.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-01-08 11:16:19
Đây là tập tin sau khi chuyển đổi Handbrake:
$ mediainfo out.mp4 | grep "Encoded date" | head -n 1
Encoded date : UTC 2012-12-24 11:39:35
Đây là tệp cuối cùng sau khi ánh xạ siêu dữ liệu:
$ 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
Trên thực tế, bạn không thực sự cần sử dụng Handbrake nếu bạn có thể sử dụng FFmpeg, mà Handbrake vẫn dựa vào. Trong trường hợp đơn giản nhất, bạn có thể thực hiện chuyển đổi của mình như thế này:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
Điều này sẽ chuyển đổi đầu vào với bộ mã hóa x264 và âm thanh AAC thành tệp đầu ra, sao chép siêu dữ liệu gốc. Để thay đổi chất lượng đầu ra, bạn có thể:
Đọc hướng dẫn mã hóa x264 trên wiki FFmpeg để biết thêm.
Unknown encoder 'libfaac'
lỗi cho tôi
-c:a aac -strict experimental
thay thế.
Thật không may, có vẻ như phanh tay không thể tự làm điều đó, nhưng tương tự như ví dụ ffmpeg, dấu thời gian có thể được sao chép từ bản gốc sau khi nén bằng cách sử dụng touch
lệnh unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
điều này sẽ đặt dấu thời gian trên tệp nén giống như tệp tham chiếu đã cho.
Tôi đã tìm thấy một cách dễ dàng hơn để làm điều này, bằng cách sử dụng một phần mềm khác có tên Adapter
: http://www.macroplant.com/ad CHƯƠNG /
Nó không có tất cả các cài đặt nâng cao như HandBrake nhưng nó thực hiện công việc (cũng sử dụng ffmpeg) và giữ lại siêu dữ liệu tôi cần.
Tôi đang sử dụng macOS Yosemite và HandBrakeBatch - sử dụng nó để chuyển đổi tệp, nhưng nhấp vào hộp "giữ ngày tạo và sửa đổi tệp" trong menu "Tùy chọn".
Sau đó, tôi nhập video vào Lightroom 5, nhưng chúng vẫn không giữ ngày tạo. Nhưng, quan trọng nhất, các tệp được hiển thị trong Finder với ngày Tạo chính xác. Vì vậy, tôi đã chọn tất cả chúng trong thư viện Lightroom → Siêu dữ liệu (cột hộp thoại bên phải) → Thời gian chụp → Thay đổi thành ngày tạo tệp → Thay đổi tất cả.
Tôi đã có 850 video gia đình cũ - Tôi đã phải thực hiện quy trình này trong lô 100. Tai nạn phanh tay với rất nhiều tệp.
Tôi đã tạo một tập lệnh bash có thể chuyển siêu dữ liệu theo lô, sử dụng touch
như được đề xuất ở trên. Để nó hoạt động, bạn phải có các tệp gốc và tệp được chuyển đổi trên các thư mục riêng biệt, mỗi tệp có cùng số tệp (thư mục chỉ phải có tệp video, vì các tệp / thư mục khác sẽ can thiệp) và theo cùng một thứ tự. Sau đó, nó chỉ sao chép siêu dữ liệu và bạn đã hoàn tất. Kịch bản liệt kê tất cả các cặp tệp để bạn có thể kiểm tra lỗi cuối cùng nếu bạn muốn.
Mã có thể không gọn gàng nhất vì đây là tập lệnh bash thích hợp đầu tiên của tôi, nhưng nó khá nhanh và ổn định đối với tôi, vì vậy hãy thực hiện:
#!/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
Để chạy sudo bash script.sh /sourcedir /converteddir
Nếu bạn có nghĩa là thời gian sửa đổi cấp độ tệp, thì tôi cũng gặp vấn đề tương tự và có thể khôi phục nó bằng exiftool .
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Cái này lấy siêu dữ liệu và FileModifyDate
từ input.mp4
và sao chép nó vào output.mp4
.
Để tự động hóa việc này khi tôi có một số lượng lớn tệp để chuyển mã, tôi đã tạo một công cụ có tên là Shrinkwrap để chuyển mã đầu tiên với FFmpeg (Tôi đã chuyển khỏi HandBrake vì cần lưu giữ nhiều siêu dữ liệu hơn), sau đó phục hồi dấu thời gian sửa đổi bằng exiftool.
Sau khi tìm kiếm nhiều, tôi chủ yếu từ bỏ việc sử dụng các tệp video cũ với ngày được tạo / sửa đổi chính xác để ghi đè lên ngày được tạo / sửa đổi của các tệp video nén Handbrake mới của tôi. Vì hầu hết các video của tôi có ngày / giờ trong tên tệp, tôi đã thử nghiệm và có hai phương pháp để hoạt động. Cách đầu tiên và tốt nhất là sử dụng phương pháp dấu thời gian của Advanced Renamer, có thể thay đổi ngày tệp được sửa đổi, tạo và truy cập, không chỉ chính tên tệp. https: //www.advgradrenamer.com/d Download .
Tôi cũng tìm thấy một tập lệnh powershell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/ có thể được lập trình viên điều chỉnh cho các định dạng tên / ngày của tệp khác. Ở trạng thái hiện tại, nó chỉ hoạt động nếu tên tệp được cấu trúc chính xác như trong ví dụ đó.
May mắn là số lượng video của tôi không có ngày được sửa đổi trong tên tệp đủ thấp để tôi có thể thay đổi những video đó một cách thủ công, sẽ không mất quá nhiều thời gian.
Tôi đã thử sử dụng ffmpeg, nhưng lệnh map_metadata của nó chỉ thay đổi dữ liệu bên trong tệp chứ không phải ngày được sửa đổi, được tạo từ chính tệp đó. Đó là loại siêu dữ liệu nội bộ Handbrake đã hoạt động tốt với mọi phương diện.
Chương trình MyFFmpeg thực hiện điều này rất tốt. Trong các tùy chọn của nó, có một lựa chọn để giữ nguyên ngày tạo / sửa đổi từ tệp nguồn .
Tôi đã tìm kiếm điều này bởi vì tôi có các video gia đình của mình trên máy chủ Plex và các tệp được sắp xếp theo ngày tạo, rất hữu ích nếu bạn muốn xem nội dung từ một năm cụ thể.
Thật không may, đây không phải là một lựa chọn miễn phí, hiện có giá 20 euro hoặc khoảng 21 US. Họ đã dùng thử 10 lần sử dụng trước khi bạn phải mua giấy phép. Ngạc nhiên là một số GUI ffmpeg miễn phí không có hoặc thêm tùy chọn này.
Tôi cố gắng duy trì ngày tạo trong khi tôi nén các video GoPro MP4 cực lớn của mình thành H.264.
Tôi tìm thấy chương trình HandBrakeBatch . Đó chính xác là những gì tôi cần để nén hơn 1000 tệp trong một lần, trong khi vẫn giữ ngày tạo (siêu dữ liệu).
Không tìm thấy bất kỳ chương trình khác có thể làm điều này. Đã thử với FFmpeg, HandBrake và chuyển đổi video tuyệt vời, nhưng không.