Как я могу найти медиа-файлы, не закодированные с определенным кодеком?

Я хотел бы стандартизировать мою коллекцию видео на конкретный видеокодек (например, высокоэффективный видеокодек x265). Я знаю, что могу получить используемый кодек из одного файла, используя, например, 'mediainfo filename | grep "Codec ID" ', который выводит видеокодек, за которым следует аудиокодек для каждого файла, например:

Codec ID                                 : V_VP8
Codec ID                                 : A_VORBIS

, который я просмотрел man find, но я не могу понять, как это сделать это. Есть идеи?

2
задан 4 June 2016 в 05:36

3 ответа

Можно получить отсортированный список кодека определенные медиа-файлы в соответствии с рабочим каталогом

$ mediainfo * | grep-v codec_id | grep .file_extension |-f2-d сокращения:> list.txt

, где codec_id является рассматриваемым кодеком (напр. h264), и file_extension является расширением рассматриваемого контейнера (напр. .mkv)

, но если имена файлов имеют пробелы между именами затем команда, не будет работать, как желаемый.

1
ответ дан 4 June 2016 в 05:36

Можно использовать этот маленький сценарий 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 использования, который довольно просто сделать.

1
ответ дан 4 June 2016 в 05:36

Комбинация 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).

1
ответ дан 4 June 2016 в 05:36

Другие вопросы по тегам:

Похожие вопросы: