Como posso encontrar arquivos de mídia não codificados com um codec específico?

2

Eu gostaria de padronizar a minha coleção de vídeos em um codec de vídeo específico (por exemplo, o x265 High Efficiency Video Codec). Eu sei que posso obter o codec em uso a partir de um único arquivo usando, por exemplo, 'mediainfo filename | grep "Codec ID" 'Que produzirá o codec de vídeo seguido pelo codec de áudio para cada arquivo como:

Codec ID                                 : V_VP8
Codec ID                                 : A_VORBIS

Revi man find , mas não consigo descobrir como conseguir isso. Alguma idéia?

    
por Elder Geek 03.06.2016 / 18:05

3 respostas

1

Você pode obter uma lista ordenada de arquivos de mídia específicos do seu codec no diretório de trabalho

$ mediainfo * | grep -v codec_id | grep .file_extension | recortar -f2 -d: > list.txt

onde codec_id é o codec em questão (ex. h264) e file_extension é a extensão do container em questão (ex. mkv)

mas se os nomes dos arquivos tiverem espaços em branco entre os nomes, o comando não funcionará como desejado.

    
por Pavel Sayekat 03.06.2016 / 19:32
2

Você pode usar este pequeno script python junto com o find para imprimir todos os arquivos com um codec específico:

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)

Isso chamará ffprobe , armazenará sua saída na cadeia json, iterará todos os fluxos e imprimirá o caminho de entrada caso o nome do codec e a correspondência de tipo. Você precisará de ffprobe para isso. Você pode obtê-lo como uma versão estática de aqui se você não o tiver instalado em seu sistema.

Depois, você pode chamá-lo em todos os arquivos usando find da seguinte forma:

find . -type f -exec python filterByCodec.py {} hevc video \;

isto imprimirá todos os vídeos contendo o codec de vídeo HEVC. Mais exemplos:

find . -type f -exec python filterByCodec.py {} h264 video \;
find . -type f -exec python filterByCodec.py {} mp3 audio \; 

Você pode estender o script e mover esses arquivos para algum diretório ou qualquer outra coisa. Isso pode ser algo assim:

cmd = 'mv ' + inputPath + ' onlyhevcDir'
os.system(cmd)

Eu sei que essa não é a melhor maneira de fazer isso, mas usar python é muito simples de fazer.

    
por incBrain 03.06.2016 / 20:15
1

Uma combinação de find , ffprobe , jq utilitários podem ser usados para imprimir informações sobre todos os arquivos *.avi , *.mp4 (na árvore de diretório atual recursivamente) que NÃO são codificados usando o codec de vídeo "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}'

Para instalar os utilitários, execute:

$ sudo apt-get install ffmpeg jq findutils

O exemplo funciona em jq 1.4 . Se apt-get version fornece uma versão mais antiga; você poderia baixar um novo binário jq (basta colocar o arquivo baixado em algum lugar em $PATH , renomeá-lo para jq e fazer executável: chmod +x jq ) .

    
por jfs 04.06.2016 / 20:28