12

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

9 ответов9

19

Вы можете скопировать существующие метаданные из одного файла в другой без необходимости перекодировать видео с помощью 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

Вот файл после преобразования Ручного тормоза:

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

4

К сожалению, кажется, что ручной тормоз не может сделать это самостоятельно, но, как и в примере с ffmpeg, временные метки могут быть скопированы из оригинала после сжатия с помощью команды touch unix:

touch -r MVI_1234.MOV compressed_MVI_1234.m4v

это установит метку времени для сжатого файла так же, как и указанный эталонный файл.

3

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

Он не имеет всех расширенных настроек, таких как HandBrake, но он выполняет свою работу (также используя ffmpeg) и сохраняет нужные мне метаданные.

2

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

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

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

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

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

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

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

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

0

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .