Como recuperar canais de áudio, taxa de bits e outras medições de qualidade para um determinado ID de faixa

1

Eu tenho este código:

track1=$(mkvmerge -I sample.mkv | sed -ne '/^Track ID [0-9]*: audio ([^)]*).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*//;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }' | cut -c1)

Ele irá recuperar o idioma de correspondência de 1 faixa em inglês.

Eu quero fazer um script para comparar as faixas de áudio no mesmo idioma e encontrar o que tiver a melhor qualidade.

Mas mkvinfo , mkvmerge e mediainfo parecem não conseguir recuperar as informações sobre uma determinada ID de faixa e não sei como analisar sua saída completa para recuperar apenas o que preciso .

Como fazer isso? Eu preciso recuperar tudo o que poderia ser necessário para adivinhar a qualidade, como formato, taxa de bits, número de canais, tamanho e armazená-lo em uma variável como track1channels .

Estou aberto a outras soluções que resolvam esse problema difícil.

    
por Freedo 06.01.2018 / 04:29

1 resposta

2

Provavelmente, existem muitas maneiras diferentes de fazer isso, dependendo da ferramenta que você deseja usar para analisar a saída. Uma maneira é fazer com que mkvmerge produza JSON e, em seguida, analise-o com jq . Por exemplo, para obter todas as faixas de áudio:

mkvmerge --identify --identification-format json sample.mkv | jq '.tracks[] | select(.type=="audio")'

Você pode especificar todos os tipos de critérios em jq , por exemplo, .id=="2" para a faixa 2 etc. Talvez você possa até fazer a comparação / classificação com jq , dependendo do que você deseja fazer, ver man jq para detalhes.

Você também pode armazenar alguma saída filtrada de jq em uma variável do shell e usar várias chamadas jq para extrair todos os campos em outras variáveis do shell. (Possivelmente há uma maneira de fazer isso em paralelo, mas eu não sei).

Editar

Quanto à taxa de bits: eu tentei com uma amostra mkv que contém AAC audio, mas nem mediainfo nem mkvinfo deram qualquer bitrate puramente para áudio em primeiro lugar. Possivelmente, poderíamos calculá-lo a partir de outras informações, como o total de bits usados para essa faixa e a duração total, mas não estou familiarizado o suficiente com os internos de um contêiner mkv para identificar qual é o número.

O .tracks[] | select(.type=="audio") lê "transmita todas as informações no campo track e, em seguida, selecione aquelas que têm um campo type que é igual a audio ". Digamos que você tenha algo como

{
  "codec": "AAC",
  "id": 1,
  "properties": {
    "audio_channels": 2,
    "audio_sampling_frequency": 44100,
    "codec_id": "A_AAC",
    "codec_private_data": "1210",
    "codec_private_length": 2,
    "default_duration": 23219954,
    "default_track": true,
    "enabled_track": true,
    "forced_track": true,
    "language": "und",
    "minimum_timestamp": 0,
    "number": 2,
    "uid": 2897612726
  },
  "type": "audio"
}

salve-o em um arquivo ou variável. Pipe isto em um segundo comando jq como jq '.properties.audio_channels' para obter subcampos. Não tenho certeza de como você pretende passar por várias trilhas ou o que você quer fazer, mas você pode fazer muito apenas com jq consultas sozinho.

Editar

Para obter o ID, o nome do codec, o codec id e o número de canais em uma única linha, faça algo como

jq '[[.id, .codec, .properties.codec_id, .properties.audio_channels] | map(tostring) | join(",")] | join("\n")'

no valor salvo (ou adicione à expressão original).

O% externo [...] captura o fluxo de registros JSON, o% interno[...] constrói uma lista que pode ser join ed com uma vírgula após converter números em sequências e, em seguida, a lista externa também é join ed por novas linhas. Eu acho que um poderia se livrar das cotações com opções de linha de comando, se necessário.

Veja também sort se você quiser classificar primeiro o número de canais, etc.

Isso está realmente se transformando em uma pergunta "como faço para usar jq propriamente", então talvez no google a jq tutorial, ou faça uma nova pergunta / novas perguntas?

    
por 06.01.2018 / 17:24