Ручний гальмо - це дивовижний інструмент стиснення відео, але він, здається, не зберігає оригінальний час зйомки після стиснення відео. Будь-яка ідея, як це виправити?
Ручний гальмо - це дивовижний інструмент стиснення відео, але він, здається, не зберігає оригінальний час зйомки після стиснення відео. Будь-яка ідея, як це виправити?
Відповіді:
Ви можете скопіювати наявні метадані з одного файлу в інший, не потребуючи повторного кодування відео за допомогою FFmpeg . В основному це займає одну секунду. Для цього припустимо три файли:
in.mp4
- вихідний файл до перетворенняout.mp4
- файл після перетворення Handbrakefixed.mp4
- файл із "виправленими" метаданимиКоманда FFmpeg для копіювання повного запису метаданих у новий файл буде:
ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4
Щоб її розбити, це робиться наступним чином:
in.mp4
і out.mp4
), яким присвоєні ідентифікатори 0 і 1 відповідно.-map 1
), тому ми беремо бітові потоки, які вже перетворені-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
Насправді, вам не потрібно використовувати Handbrake, якщо ви можете використовувати FFmpeg, на який Handbrake в будь-якому випадку покладається. У найпростішому випадку конверсію можна зробити так:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 -c:a aac -map_metadata 0 out.mp4
Це перетворить вхід з кодером x264 та аудіо AAC у вихідний файл, копіюючи вихідні метадані. Для того, щоб змінити якість виводу, ви можете:
Докладніше прочитайте посібник з кодування x264 на вікі FFmpeg.
Unknown encoder 'libfaac'
помилку
-c:a aac -strict experimental
замість цього.
На жаль, схоже, що ручний гальмо не може зробити це самостійно, але подібно до прикладу ffmpeg, часові позначки можна скопіювати з оригіналу після стиснення за допомогою команди touch
unix:
touch -r MVI_1234.MOV compressed_MVI_1234.m4v
це встановить часову позначку для стисненого файлу такою ж, як для даного довідкового файлу.
Я знайшов простіший спосіб зробити це, використовуючи інше програмне забезпечення під назвою Adapter
: http://www.macroplant.com/adapter/
У нього немає всіх розширених налаштувань, як HandBrake, але він виконує цю роботу (також використовуючи ffmpeg) і зберігає потрібні мені метадані.
Я використовую macOS Yosemite і HandBrakeBatch - використовуйте його для конвертації файлів, але натисніть поле "зберегти дати створення та зміни файлів" у меню "Налаштування".
Потім я імпортую відео в Lightroom 5, але вони все ще не зберігають дати створення. Але найголовніше, що файли відображаються в Finder з правильною датою створення. Тому я вибрав їх у бібліотеці Lightroom → Метадані (правий діалоговий стовпець) → Час зйомки → Змінити дату створення файлу → Змінити всі.
У мене було 850 старих сімейних відеозаписів - мені довелося робити цей процес партіями по 100. Ручний гальмо виходить з ладу з великою кількістю файлів.
Я створив сценарій 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
Якщо ви маєте на увазі час модифікації файлового рівня, у мене виникла та сама проблема, і я зміг відновити її за допомогою exiftool .
exiftool -tagsFromFile input.mp4 -extractEmbedded -all:all -FileModifyDate -overwrite_original output.mp4
Це приймає метадані і FileModifyDate
від input.mp4
і копіює його output.mp4
.
Щоб автоматизувати це, оскільки у мене було велику кількість файлів для перекодування, я створив інструмент під назвою Shrinkwrap, який спочатку перекодує FFmpeg (я відійшов від HandBrake через необхідність збереження більше метаданих), а потім відновлює часову позначку модифікації exiftool.
Після багатьох пошуків я здебільшого відмовився від використання старих відеофайлів із правильною датою, створеною / модифікованою, щоб замінити дату, створену / модифіковану моїми новими відеофайлами, стисненими Handbrake. Оскільки більшість моїх відео мають дату / час у назві файлу, я експериментував і отримав два методи роботи. Перше і найкраще - це використовувати метод розширених часових позначок Advanced Renamer, який МОЖЕ змінити дату файлу, змінену, створену та доступну, а не лише саме ім'я файлу. https://www.advancedrenamer.com/download .
Я також знайшов сценарій https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/, який може бути адаптований програмістом для інших форматів назв / дати. У своєму нинішньому стані він працює лише у тому випадку, якщо ім'я файлу структуровано точно так, як є у тому прикладі.
На щастя, кількість моїх відео без дати, зміненої у назві файлу, є достатньо низькою, і я можу їх змінити вручну, не займе багато часу.
Я намагався використовувати ffmpeg, але його команда map_metadata змінює лише дані всередині файлу, а не дату, змінену, створену з самого файлу. Цей тип внутрішніх метаданих Handbrake вже добре справляється з будь-яким часом.
Програма MyFFmpeg робить це дуже добре. У його параметрах є вибір Зберегти оригінальну дату створення / зміну з вихідного файлу .
Я шукав це, тому що у мене домашні відеозаписи на сервері Plex, а файли впорядковані за датою створення, що дуже корисно, якщо ви хочете побачити матеріали певного року.
На жаль, це не безкоштовний варіант, зараз коштує 20 євро або близько 21 США. Вони мають пробну версію на 10 застосувань, перш ніж купувати ліцензію. Здивовано, що деякі безкоштовні графічні інтерфейси ffmpeg не мають або додають цю опцію.
Я намагаюся підтримувати дату створення, поки я стискаю свої неймовірно великі відео GoPro MP4 в H.264.
Я знайшов програму HandBrakeBatch . Саме це мені потрібно за один раз стиснути понад 1000 файлів, зберігаючи дату створення (метадані).
Не знайшли жодної іншої програми, яка б це могла зробити. Пробували з FFmpeg, HandBrake та чудовим відео конвертером, але ні.