Як змусити Handbrake зберегти час захоплення / час створення?


14

Ручний гальмо - це дивовижний інструмент стиснення відео, але він, здається, не зберігає оригінальний час зйомки після стиснення відео. Будь-яка ідея, як це виправити?


@slhck Так, я маю на увазі Час створення. Я використовую Lightroom для управління своїми відео, і після стиснення час зйомки / створення стає Модифікованим часом.
pixelfreak

Відповіді:


21

Ви можете скопіювати наявні метадані з одного файлу в інший, не потребуючи повторного кодування відео за допомогою FFmpeg . В основному це займає одну секунду. Для цього припустимо три файли:

  • in.mp4 - вихідний файл до перетворення
  • out.mp4 - файл після перетворення Handbrake
  • fixed.mp4 - файл із "виправленими" метаданими

Команда FFmpeg для копіювання повного запису метаданих у новий файл буде:

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

Пояснення синтаксису:

Щоб її розбити, це робиться наступним чином:

  • Візьміть два вхідні файли ( in.mp4і out.mp4), яким присвоєні ідентифікатори 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

Ось файл після перетворення Handbrake:

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

Насправді, вам не потрібно використовувати Handbrake, якщо ви можете використовувати FFmpeg, на який Handbrake в будь-якому випадку покладається. У найпростішому випадку конверсію можна зробити так:

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

Це перетворить вхід з кодером x264 та аудіо AAC у вихідний файл, копіюючи вихідні метадані. Для того, щоб змінити якість виводу, ви можете:

  • Змініть значення CRF для відео. Нижня означає кращу якість. 23 за замовчуванням, і все, що не перевищує 18 років, вірогідно буде без втрат.
  • Змініть бітрейт для звуку. Додаткову інформацію див. У посібнику з кодування AAC .

Докладніше прочитайте посібник з кодування x264 на вікі FFmpeg.


1
Нічого собі, це круте вирішення, хоч виглядає трохи непросто, хотілося б, щоб Ручний гальмо робив це за кадром. Спасибі!
pixelfreak

Команда передачі метаданих працює, але остання команда для перетворення також дала мені Unknown encoder 'libfaac'помилку
pixelfreak

Тоді ваш ffmpeg не компілюється з підтримкою FAAC. Спробуйте -c:a aac -strict experimentalзамість цього.
slhck

5

На жаль, схоже, що ручний гальмо не може зробити це самостійно, але подібно до прикладу ffmpeg, часові позначки можна скопіювати з оригіналу після стиснення за допомогою команди touchunix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

це встановить часову позначку для стисненого файлу такою ж, як для даного довідкового файлу.


1
Він встановить часову позначку для файлу, так, але лише у файловій системі. Дані EXIF ​​не матимуть правильної часової позначки "Дата / час".
Стівен Шраугер

3

Я знайшов простіший спосіб зробити це, використовуючи інше програмне забезпечення під назвою Adapter: http://www.macroplant.com/adapter/

У нього немає всіх розширених налаштувань, як HandBrake, але він виконує цю роботу (також використовуючи ffmpeg) і зберігає потрібні мені метадані.


1
Я не думаю, що адаптер здатний це зробити. Я щойно перевірив найновішу версію і не можу ніде знайти налаштування для збереження метаданих. Крім того, схоже, не конвертуються всі типи відеофайлів, наприклад, MTS тощо.
jjj

занадто погано, що він не сумісний з форматом m2ts Sony
Дієго Вієйра

2

Я використовую macOS Yosemite і HandBrakeBatch - використовуйте його для конвертації файлів, але натисніть поле "зберегти дати створення та зміни файлів" у меню "Налаштування".

Потім я імпортую відео в Lightroom 5, але вони все ще не зберігають дати створення. Але найголовніше, що файли відображаються в Finder з правильною датою створення. Тому я вибрав їх у бібліотеці Lightroom → Метадані (правий діалоговий стовпець) → Час зйомки → Змінити дату створення файлу → Змінити всі.

У мене було 850 старих сімейних відеозаписів - мені довелося робити цей процес партіями по 100. Ручний гальмо виходить з ладу з великою кількістю файлів.


Приємна знахідка, я бачу себе за допомогою цього додатка багато.
calum_b

Зауважте, що додаток більше не підтримується : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck

1

Я створив сценарій bash, який може пакетно переносити метадані, використовуючи, touchяк було запропоновано вище. Щоб він працював, ви повинні мати свої оригінальні та перетворені файли в окремих каталогах, кожен з однаковою кількістю файлів (каталоги повинні мати лише відеофайли, оскільки інші файли / каталоги будуть заважати) і в тому ж порядку. Потім він просто копіює метадані, і ви все готово і готово. Сценарій перелічує всі пари файлів, щоб ви могли в кінці кінців перевірити помилки.

Код може бути не найновішим, оскільки це був мій перший правильний скрипт 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

Це приймає метадані і FileModifyDateвід input.mp4і копіює його output.mp4.

Щоб автоматизувати це, оскільки у мене було велику кількість файлів для перекодування, я створив інструмент під назвою Shrinkwrap, який спочатку перекодує FFmpeg (я відійшов від HandBrake через необхідність збереження більше метаданих), а потім відновлює часову позначку модифікації exiftool.


0

Після багатьох пошуків я здебільшого відмовився від використання старих відеофайлів із правильною датою, створеною / модифікованою, щоб замінити дату, створену / модифіковану моїми новими відеофайлами, стисненими Handbrake. Оскільки більшість моїх відео мають дату / час у назві файлу, я експериментував і отримав два методи роботи. Перше і найкраще - це використовувати метод розширених часових позначок Advanced Renamer, який МОЖЕ змінити дату файлу, змінену, створену та доступну, а не лише саме ім'я файлу. https://www.advancedrenamer.com/download .

Я також знайшов сценарій https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/, який може бути адаптований програмістом для інших форматів назв / дати. У своєму нинішньому стані він працює лише у тому випадку, якщо ім'я файлу структуровано точно так, як є у тому прикладі.

На щастя, кількість моїх відео без дати, зміненої у назві файлу, є достатньо низькою, і я можу їх змінити вручну, не займе багато часу.

Я намагався використовувати ffmpeg, але його команда map_metadata змінює лише дані всередині файлу, а не дату, змінену, створену з самого файлу. Цей тип внутрішніх метаданих Handbrake вже добре справляється з будь-яким часом.


0

Програма MyFFmpeg робить це дуже добре. У його параметрах є вибір Зберегти оригінальну дату створення / зміну з вихідного файлу .

Я шукав це, тому що у мене домашні відеозаписи на сервері Plex, а файли впорядковані за датою створення, що дуже корисно, якщо ви хочете побачити матеріали певного року.

На жаль, це не безкоштовний варіант, зараз коштує 20 євро або близько 21 США. Вони мають пробну версію на 10 застосувань, перш ніж купувати ліцензію. Здивовано, що деякі безкоштовні графічні інтерфейси ffmpeg не мають або додають цю опцію.


0

Я намагаюся підтримувати дату створення, поки я стискаю свої неймовірно великі відео GoPro MP4 в H.264.

Я знайшов програму HandBrakeBatch . Саме це мені потрібно за один раз стиснути понад 1000 файлів, зберігаючи дату створення (метадані).

Не знайшли жодної іншої програми, яка б це могла зробити. Пробували з FFmpeg, HandBrake та чудовим відео конвертером, але ні.


Зауважте, що HandBrakeBatch більше не підтримується : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.