Eu tenho este código:
track1=$(mkvmerge -I sample.mkv | sed -ne '/^Track ID [0-9]*: audio ([^)]*).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }' | cut -c1)
Ele recuperará a 1 faixa correspondente ao idioma inglês.
Eu quero fazer um script para comparar entre as faixas de áudio do mesmo idioma e encontrar aquela com a maior qualidade.
Mas mkvinfo
, mkvmerge
e mediainfo
não parece ser capaz de recuperar as informações sobre um determinado ID de faixa, e não sei como analisar sua saída completa para recuperar apenas o que preciso.
Como fazer isso? Preciso recuperar tudo o que pode 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 difícil problema.
Provavelmente há muitas maneiras diferentes de fazer isso, dependendo de qual ferramenta você deseja usar para analisar a saída. Uma maneira é
mkvmerge
produzir JSON e, em seguida, analisá-lo comjq
. Por exemplo, para obter todas as faixas de áudio: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 comjq
, dependendo do que deseja fazer, veja osman jq
detalhes.Você também pode armazenar alguma saída filtrada
jq
em uma variável de shell e usar váriasjq
chamadas para extrair todos os campos em outras variáveis de shell. (possivelmente existe uma maneira de fazer isso em paralelo, mas não sei).Editar
Quanto à taxa de bits: tentei com uma amostra
mkv
que contémAAC
áudio, masmediainfo
nemmkvinfo
dá nenhuma taxa de bits puramente para áudio em primeiro lugar. Possivelmente, pode-se calculá-lo a partir de outras informações, como o total de bits usados para esta faixa e a duração total, mas não estou familiarizado o suficiente com o interior de um contêiner mkv para identificar qual número é qual.As
.tracks[] | select(.type=="audio")
leituras "transmitem todas as informações notrack
campo e, em seguida, selecionam aquelas que possuem umtype
campo igual aaudio
". Digamos que você obtenha algo comoem seguida, salve-o em um arquivo ou variável. Canalize isso em um segundo
jq
comando comojq '.properties.audio_channels'
obter subcampos. Não tenho certeza de como você pretende percorrer várias faixas ou o que deseja fazer, mas pode fazer muito apenas comjq
consultas.Editar
Para obter id, nome do codec, id do codec e número de canais em uma única linha, faça algo como
no valor salvo (ou adicionar à expressão original).
O externo
[...]
captura o fluxo de registros JSON, o interno[...]
constrói uma lista que pode serjoin
inserida com uma vírgula após a conversão de números em strings e, em seguida, a lista externa também éjoin
codificada por novas linhas. Acho que alguém poderia se livrar das aspas com opções de linha de comando, se necessário.Verifique também
sort
se você deseja classificar primeiro por número de canais, etc.Isso está realmente se transformando em uma pergunta "como faço para usar
jq
corretamente", então talvez pesquise umjq
tutorial no Google ou faça uma nova pergunta/novas perguntas?