Как заставить Handbrake сохранить время захвата / время создания?

14

Handbrake - это потрясающий инструмент сжатия видео, но он не сохраняет первоначальное время захвата после сжатия видео. Есть идеи, как это исправить?

pixelfreak
источник
@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 в output ( -map 1), поэтому мы возьмем уже преобразованные битовые потоки
  • Сопоставить только метаданные из файла 0 с выходными данными ( -map_metadata 0)
  • Используйте кодек copy ( -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    

Если вы хотите сделать все с 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.

slhck
источник
1
Вау, это крутой обходной путь, хотя выглядит немного устрашающе, я бы хотел, чтобы Handbrake делал это за сценой. Благодарность!
pixelfreak
Команда передачи метаданных работает, но последняя команда, которая также Unknown encoder 'libfaac'
выполнила
Тогда ваш 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) и сохраняет нужные мне метаданные.

pixelfreak
источник
1
Я не думаю, что адаптер может сделать это. Я только что протестировал новейшую версию и нигде не могу найти настройки для сохранения метаданных. Кроме того, кажется, что он не конвертирует все типы видеофайлов, такие как MTS и т. Д.
jjj
Жаль, что это не совместимо с форматом Sony's m2ts
Диего Виейра
2

Я использую macOS Yosemite и HandBrakeBatch - используйте его для конвертации файлов, но нажмите в поле «Сохранить даты создания и изменения файлов» в меню «Настройки».

Затем я импортирую видео в Lightroom 5, но они все еще не сохраняют даты создания. Но, самое главное, файлы отображаются в Finder с правильной датой создания. Поэтому я выбрал их все в библиотеке Lightroom → Метаданные (правая колонка диалога) → Время захвата → Изменить на дату создания файла → Изменить все.

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

Regis
источник
Хорошая находка, могу видеть себя с помощью этого приложения много.
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.

bennetimo
источник
0

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

Я также нашел скрипт powershell https://www.michaelmiklis.de/set-creation-and-modification-date-from-filename/, который может быть адаптирован программистом для других форматов имени файла / даты. В своем текущем состоянии он работает только в том случае, если имя файла структурировано точно так же, как в этом примере.

К счастью, мое количество видео без даты изменения в имени файла достаточно мало, я могу изменить их вручную, это не займет много времени

Я попытался использовать ffmpeg, но его команда map_metadata изменяет только данные внутри файла, а не дату изменения, созданную самим файлом. Такого рода внутренние метаданные Handbrake уже отлично работают в любом случае.

Eregos
источник
0

Программа MyFFmpeg делает это очень хорошо. В его настройках есть выбор Сохранить исходную дату создания / изменения из исходного файла .

Я искал это, потому что у меня есть домашнее видео на сервере Plex, а файлы упорядочены по дате создания, что очень полезно, если вы хотите посмотреть материал определенного года.

К сожалению, это не бесплатный вариант, в настоящее время стоит 20 евро или около 21 США. У них есть пробная версия на 10 использований, прежде чем купить лицензию. Удивило, что некоторые бесплатные графические интерфейсы ffmpeg не имеют или не добавляют эту опцию.

Хьюстон
источник
0

Я пытаюсь сохранить дату создания, в то время как я сжимаю свои невероятно большие видео GoPro MP4 в H.264.

Я нашел программу HandBrakeBatch . Это именно то, что мне нужно, чтобы сжать более 1000 файлов за один раз, сохранив дату создания (метаданные).

Не нашли никаких других программ, способных это сделать. Пробовал с FFmpeg, HandBrake и Wonderful Video Converter, но нет.

Джим
источник
Обратите внимание, что HandBrakeBatch больше не поддерживается : osomac.com/2013/08/08/handbrake-adds-real-batch-processing
slhck