Làm thế nào để Handbrake bảo toàn thời gian chụp / thời gian tạo?


14

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?


@slhck Vâng, ý tôi là Thời gian sáng tạo. Tôi sử dụng Lightroom để quản lý video của mình và sau khi nén, thời gian Chụp / Tạo trở thành Thời gian sửa đổi.
pixelfreak

Câu trả lời:


21

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 đổi
  • out.mp4 - tệp sau khi chuyển đổi Handbrake
  • fixed.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

Giải thích về cú pháp:

Để phá vỡ nó, điều này làm như sau:

  • Lấy hai tệp đầu vào ( in.mp4out.mp4), được gán ID tương ứng 0 và 1.
  • Chỉ ánh xạ các luồng video / âm thanh / phụ đề từ tệp 1 sang đầu ra ( -map 1), vì vậy chúng tôi lấy các luồng bit đã được chuyển đổi
  • Chỉ ánh xạ siêu dữ liệu từ tệp 0 đến đầu ra ( -map_metadata 0)
  • Sử dụng codec sao chép ( -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.mp4thành out.mp4.


Bằng chứng:

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    

Nếu bạn muốn làm tất cả với FFmpeg:

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ể:

  • Thay đổi giá trị CRF cho video. Thấp hơn có nghĩa là chất lượng tốt hơn. 23 là mặc định, và bất cứ điều gì dưới 18 có thể sẽ bị mất trực quan.
  • Thay đổi bitrate cho âm thanh. Xem hướng dẫn mã hóa AAC để biết thêm.

Đọc hướng dẫn mã hóa x264 trên wiki FFmpeg để biết thêm.


1
Wow, đó là một cách giải quyết tuyệt vời, mặc dù có vẻ hơi nản chí, tôi ước Handbrake thực hiện điều này đằng sau hậu trường. Cảm ơn!
pixelfreak

Lệnh chuyển siêu dữ liệu hoạt động, nhưng lệnh cuối cùng để thực hiện chuyển đổi cũng gây ra Unknown encoder 'libfaac'lỗi cho tôi
pixelfreak

Sau đó, ffmpeg của bạn không được biên dịch với sự hỗ trợ của FAAC. Hãy thử -c:a aac -strict experimentalthay thế.
slhck 30/03/2015

5

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 touchlệ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.


1
Nó sẽ đặt dấu thời gian cho tệp, vâng, nhưng chỉ trong hệ thống tệp. Dữ liệu EXIF ​​sẽ không có dấu thời gian "Ngày / Giờ gốc" chính xác.
Stephen Schrauger

3

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.


1
Tôi không nghĩ Adaptor có thể làm điều này. Tôi vừa thử nghiệm phiên bản mới nhất và không thể tìm thấy cài đặt để giữ lại siêu dữ liệu ở bất cứ đâu. Ngoài ra, nó dường như không chuyển đổi tất cả các loại tệp video, chẳng hạn như MTS, v.v.
jjj

quá tệ, nó không tương thích với định dạng m2ts của sony
Diego Vieira

2

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ìm thấy tốt, có thể thấy mình sử dụng ứng dụng này rất nhiều.
calum_b

Lưu ý rằng ứng dụng không còn được duy trì : osomac.com/2013/08/08/handbrake-adds-real-batch- Processing
slhck

1

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 touchnhư đượ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


1

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à FileModifyDatetừ input.mp4và 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.


0

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.


0

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.


0

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.


Lưu ý rằng HandBrakeBatch không còn được duy trì : osomac.com/2013/08/08/handbrake-adds-real-batch- Processing
slhck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.