Уберите метаданные из всех форматов с помощью FFmpeg
Как я могу удалить все метаданные из всех форматов через FFmpeg?
Я могу просто установить специальные метаданные для каждого формата на человека ffmpeg. Любой вариант или метод, чтобы очистить все метаданные и раздеть носители из всех метаданных, доступных на ffmpeg?
-metadata key=value
Set a metadata key/value pair.
For example, for setting the title in the output file:
ffmpeg -i in.avi -metadata title="my title" out.flv
4 ответа
Немного модифицировав командную строку @izx, я получил это:
ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov
Результат (опять же, проверено с exiftool
), запись метаданных уменьшена с 81 до 52 строк. Обратите внимание, что вы не можете просто удалить все метаданные, некоторые вещи останутся. Тем не менее, я не получил дату создания, чтобы изменить, что странно, потому что она, казалось, работала в версии Ubuntu.
Я разместил в списке рассылки FFmpeg вопрос о том, есть ли какие-либо обновления или комментарии по этому поводу. Посмотрим, что они скажут.
ПРИМЕЧАНИЕ: с тех пор я обновил ffmpeg
(ранее у меня была устаревшая версия avconv
из репозиториев Ubuntu).
Сейчас @slhck's -map_metadata -1
работает отлично.
Я рекомендую решение @ slhck, потому что оно менее типично и актуально. Я оставляю это здесь для тех, кто использует устаревшую версию.
Самый простой способ сделать это - установить -map_metadata
использовать один из входных потоков, а не использовать глобальные метаданные. 99% времени это должно работать. ПРИМЕЧАНИЕ: я использую avconv, потому что это в репозиториях Ubuntu 12.04; это, вероятно, будет совместимо с ffmpeg, так как их синтаксис всегда в моем опыте.
avconv -i input.mp4 -map 0 -map_metadata 0:s:0 -c copy output.mp4
Это возьмет метаданные из первого потока данных (обычно видеопоток) и использует их для замены глобальных метаданных файла контейнера. Это работает, потому что большую часть времени потоки данных не имеют значимых метаданных, записанных в них; однако иногда это происходит, и вы хотите полностью избавиться от этих метаданных. К сожалению, единственный способ сделать это - использовать канал и два процесса avconv.
avconv -i input.mp4 -f wav - | avconv -i - -i input.mp4 -map 1 -map_metadata 0 -c copy output.mp4
При этом используется тот факт, что файлы WAV не могут содержать метаданные (поскольку формат был создан до появления тегов метаданных).
Оба эти метода очищают все метаданные в файле, на котором я только что их протестировал, - все это exiftool
была информация о кодеке, и avprobe не сообщил мне никаких метаданных. Использование канала для этого довольно уродливо, и первый метод будет работать в 99% случаев, поэтому это должно быть предпочтительным.
Мое решение убрать метаданные, главы, изменить время создания и заголовок. Таким образом, любой метаконтент должен отличаться от исходного файла:
ffmpeg -y -i "test.mkv" -c copy -map_metadata -1 -metadata title="My Title" -metadata creation_time=2016-09-20T21:30:00 -map_chapters -1 "test.mkv"
Чтобы удалить метаданные, я использую-map_metadata:g -1
потому что я удаляю только глобальные метаданные и сохраняю метаданные субтитров, такие как названия языков треков:
$ ffmpeg -hide_banner -i "$video" -map 0:v:0? -map 0:a? -map 0:s? -c copy -map_metadata:g -1 "$outputVideo"
The -map 0:...?
Аргумент option означает, что (согласноman ffmpeg
) :
Завершающий знак "?" после индекса потока карта будет необязательной: если карта не соответствует ни одному потоку, карта будет игнорироваться, а не давать сбой.