Вопрос или проблема
Как я могу удалить все метаданные из всех форматов с помощью FFmpeg?
Я могу просто установить специальные метаданные для каждого формата согласно man ffmpeg. Есть ли какой-либо вариант или метод для очистки всех метаданных и удаления медиа из всех метаданных, доступных в ffmpeg?
-metadata key=value
Установить пару ключ/значение метаданных.
Например, для установки названия в выходном файле:
ffmpeg -i in.avi -metadata title="my title" out.flv
Немного изменив командную строку от @izx, я получил следующее:
ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov
Результат (снова проверено с помощью exiftool
): запись метаданных уменьшилась с 81 до 52 строк. Обратите внимание, что вы не можете просто удалить все метаданные, некоторые вещи останутся.
Если вы хотите удалить вновь добавленное поле encoder
, добавьте это в команду (перед именем выходного файла):
-fflags +bitexact -flags:v +bitexact -flags:a +bitexact
Спасибо @wisbucky за подсказку.
Тем не менее, я не смог изменить дату создания, что странно, потому что, казалось, это работало в версии Ubuntu. Я опубликовал сообщение на форуме пользователей FFmpeg, спрашивая, были ли какие-либо обновления или комментарии на этот счет, но ответа не последовало.
ПРИМЕЧАНИЕ: С тех пор я обновил ffmpeg
(ранее у меня была устаревшая версия avconv
из репозиториев Ubuntu).
Теперь @slhck’s -map_metadata -1
работает безупречно.
Я рекомендую @slhck’s решение, потому что это требует меньше времени на набор и актуально. Я оставляю это здесь для тех, кто использует устаревшую версию.
Самый простой способ сделать это — установить -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"
Аргумент опции -map 0:...?
означает, что (согласно man ffmpeg
):
Знак “?” в конце после индекса потока сделает соответствие опциональным: если соответствие не будет найдено, карта будет игнорироваться вместо того, чтобы вызывать ошибку.
Это может быть не очень полезно для многих людей (из-за перекодирования и размера промежуточного файла). Но для некоторых случаев использования это может быть полезный подход. Идея заключается в том, чтобы декодировать изображение/видео в файл y4m (сырые пиксельные данные). И перекодировать его обратно. Этот первый шаг удаляет ВСЕ метаданные.
ffmpeg -i foo.jpg bar.y4m
ffmpeg -i bar.y4m bar.jpg
rm bar.y4m
Что мне нравится в этом, так это то, что легко запомнить команду. Но помните, что перекодирование требует времени и добавляет больше искажений к сигналу. Промежуточный файл также будет очень большим, если вы сделаете это с видео. Но если вас не беспокоят эти ограничения, дерзайте 😉
Ответ или решение
Чтобы удалить все метаданные из медиафайлов, вы можете использовать мощный инструмент FFmpeg. Это библиотека и программа для обработки мультимедиа, которая предоставляет обширный набор опций для работы с видео и аудио. В этом ответе мы рассмотрим несколько эффективных способов, как полностью очистить метаданные из файлов различных форматов с помощью FFmpeg.
Удаление всех метаданных
Для того чтобы удалить все метаданные из медиафайла, наиболее простым и распространённым способом является использование параметра -map_metadata
. Этот параметр контролирует, какие метаданные копируются в выходной файл. Чтобы удалить все метаданные, можно установить значение -1
. Пример команды:
ffmpeg -i input.mp4 -map_metadata -1 -c copy output.mp4
Разбор команды:
-i input.mp4
: указывает входной файл.-map_metadata -1
: отключает копирование всех метаданных.-c copy
: копирует потоки (видео, аудио) без перекодирования, что ускоряет процесс.output.mp4
: имя выходного файла.
Удаление ограниченных метаданных
Если вы хотите удалить только глобальные метаданные, сохранив при этом метаданные, связанные с субтитрами, можно использовать следующую команду:
ffmpeg -i input.mp4 -map 0 -map_metadata:g -1 -c copy output.mp4
Здесь параметр -map 0
указывает на копирование всех потоков из входного файла, в то время как -map_metadata:g -1
удаляет только глобальные метаданные.
Специальные фильтры
Если вы хотите дополнительно изменить поле, например, дату создания или заголовок, можно добавить параметры -metadata
. Пример:
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 "output.mkv"
Полное удаление метаданных с перекодированием
Если упрощённые команды не дают желаемых результатов, можно использовать подход с промежуточным форматом, который полностью очищает метаданные. Для этого мы можем сначала конвертировать медиафайл в формат без метаданных:
ffmpeg -i input.mp4 -f y4m - | ffmpeg -i - -c copy output.mp4
Сравнение методов
- Удаление метаданных с помощью
-map_metadata -1
: Это быстрый способ удалить метаданные, не изготавливая промежуточные файлы. - Перекодирование с использованием промежуточного формата: Наиболее эффективный метод для удаления всех видов метаданных, однако он требует больше времени и пространства для хранения во время процесса.
Заключение
Удаление метаданных из медиафайлов с помощью FFmpeg — это оперативная задача, которую можно выполнить несколькими способами. Выбор метода зависит от ваших требований и доступных ресурсов. Наиболее предпочтительных подход в большинстве случаев — это использование -map_metadata -1
для простоты и скорости, в то время как перекодирование может быть удобным для полного удаления всех метаданных.
Если у вас возникли дополнительные вопросы по работе с FFmpeg или обработке мультимедийных файлов, не стесняйтесь задавать их!