Handbrake - это потрясающий инструмент сжатия видео, но он не сохраняет первоначальное время захвата после сжатия видео. Есть идеи, как это исправить?
Handbrake - это потрясающий инструмент сжатия видео, но он не сохраняет первоначальное время захвата после сжатия видео. Есть идеи, как это исправить?
Ответы:
Вы можете скопировать существующие метаданные из одного файла в другой без необходимости перекодировать видео с помощью 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
Вот файл после преобразования Ручного тормоза:
$ 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.
После долгих поисков я в основном отказался от использования старых видеофайлов с правильной датой создания / изменения, чтобы перезаписать дату создания / изменения моих новых видеофайлов, сжатых вручную. Так как большинство моих видео имеют дату / время в имени файла, я экспериментировал и получил два метода для работы. Первый и лучший способ - использовать метод отметки времени Advanced Renamer, который МОЖЕТ изменить дату изменения файла, создания и доступа к нему, а не только само имя файла. https://www.advancedrenamer.com/download .
Я также нашел скрипт powershell 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 и Wonderful Video Converter, но нет.