Я хотел бы стандартизировать мою коллекцию видео на конкретный видеокодек (например, высокоэффективный видеокодек x265). Я знаю, что могу получить используемый кодек из одного файла, используя, например, 'mediainfo filename | grep "Codec ID" ', который выводит видеокодек, за которым следует аудиокодек для каждого файла, например:
Codec ID : V_VP8
Codec ID : A_VORBIS
, который я просмотрел man find
, но я не могу понять, как это сделать это. Есть идеи?
Можно получить отсортированный список кодека определенные медиа-файлы в соответствии с рабочим каталогом
$ mediainfo * | grep-v codec_id | grep .file_extension |-f2-d сокращения:> list.txt
, где codec_id является рассматриваемым кодеком (напр. h264), и file_extension является расширением рассматриваемого контейнера (напр. .mkv)
, но если имена файлов имеют пробелы между именами затем команда, не будет работать, как желаемый.
Можно использовать этот маленький сценарий Python вместе с находкой для печати всех файлов с определенным кодеком:
filterByCodec.py
import os
import sys
import json
inputPath = sys.argv[1]
codec = sys.argv[2]
type = sys.argv[3]
cmd = 'ffprobe -v quiet -show_streams -print_format json ' + inputPath
output = os.popen(cmd).read()
output = json.loads(output)
if not 'streams' in output:
sys.exit(0)
for stream in output['streams']:
if stream['codec_name'] == codec and stream['codec_type'] == type:
print inputPath
sys.exit(0)
Это будет звонить ffprobe
, сохраните его вывод в строке json, выполните итерации по всем потокам и распечатайте входной путь в случае, если имя кодека и вводит соответствие. Вам будет нужно ffprobe
для этого. Можно получить его как статическую сборку отсюда, если Вам не установили его в Вашей системе.
Затем можно назвать его на каждом использовании файла find
как это:
find . -type f -exec python filterByCodec.py {} hevc video \;
это распечатает все видео, содержащие видеокодек HEVC. Больше примеров:
find . -type f -exec python filterByCodec.py {} h264 video \;
find . -type f -exec python filterByCodec.py {} mp3 audio \;
Можно расширить сценарий и переместить те файлы в некоторый каталог или что бы то ни было. Это могло выглядеть примерно так:
cmd = 'mv ' + inputPath + ' onlyhevcDir'
os.system(cmd)
Я знаю, что это не лучший способ сделать это, но Python использования, который довольно просто сделать.
Комбинация find
, ffprobe
, jq
утилиты могли использоваться для печати информации обо всех *.avi
, *.mp4
файлы (в дереве текущего каталога рекурсивно), которые НЕ кодируются с помощью "h264"
видеокодек:
$ find -name \*.avi -o -name \*.mp4 \
-exec ffprobe -v quiet -show_streams -show_format -of json {} \; |
jq -c '.format.filename as $path |
.streams[]? |
select(.codec_type=="video" and .codec_name!="h264") |
{codec: .codec_name, path: $path}'
Для установки утилит работайте:
$ sudo apt-get install ffmpeg jq findutils
Пример продолжает работать jq
1.4
. Если apt-get
версия обеспечивает более старую версию; Вы могли загрузить более новое jq
двоичный файл (просто помещает загруженный файл где-нибудь в $PATH
, переименуйте его к jq
и сделайте это исполняемым файлом: chmod +x jq
).