나는 이 코드를 가지고 있습니다 :
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)
영어 언어와 일치하는 트랙 1개를 검색합니다.
동일한 언어의 오디오 트랙을 비교하고 가장 높은 품질의 오디오 트랙을 찾는 스크립트를 만들고 싶습니다.
그러나 mkvinfo
, mkvmerge
및 mediainfo
은(는) 특정 트랙 ID에 대한 정보를 검색할 수 없는 것 같습니다. 필요한 정보만 검색하기 위해 전체 출력을 구문 분석하는 방법을 모르겠습니다.
어떻게 해야 하나요? 형식, 비트 전송률, 채널 수, 크기 등 품질을 추측하는 데 필요한 모든 것을 검색하여 track1channels
.
나는 이 퍼즐에 대한 다른 해결책을 찾고 있습니다.
답변1
출력을 구문 분석하는 데 사용하려는 도구에 따라 이를 수행하는 방법은 여러 가지가 있을 수 있습니다. 한 가지 방법은 mkvmerge
JSON을 생성한 다음 를 사용하여 jq
모든 오디오 트랙을 얻는 것입니다.
mkvmerge --identify --identification-format json sample.mkv | jq '.tracks[] | select(.type=="audio")'
트랙 2 등 jq
다양한 조건을 에서 지정할 수 있습니다. 수행하려는 작업에 따라 를 .id=="2"
사용하여 비교/정렬할 수도 있습니다. 자세한 내용은 을 참조하세요.jq
man jq
jq
필터링된 일부 출력을 쉘 변수에 저장 하고 여러 jq
호출을 사용하여 모든 필드를 다른 쉘 변수로 추출할 수도 있습니다. (병렬 접근 방식이 있을 수 있지만 잘 모르겠습니다.)
편집하다
비트 전송률에 관해서는: 오디오가 mkv
포함된 샘플을 시도했지만 처음부터 순수한 오디오 비트 전송률을 제공하지 않았습니다. 트랙에서 사용된 총 비트 수 및 총 지속 시간과 같은 다른 정보를 기반으로 이를 계산할 수도 있지만, 어떤 숫자가 어느 숫자인지 파악하기에는 mkv 컨테이너의 내부에 대해 충분히 익숙하지 않습니다.AAC
mediainfo
mkvinfo
.tracks[] | select(.type=="audio")
"필드의 모든 정보를 스트리밍 track
한 다음 type
같음 필드가 있는 정보를 선택하세요"를 읽어보세요 audio
. 당신이 다음과 같은 것을 얻는다고 가정 해 봅시다.
{
"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"
}
그런 다음 파일이나 변수에 저장합니다. 이를 하위 필드 가져오기 jq
와 같은 두 번째 명령 에 파이프합니다. jq '.properties.audio_channels'
여러 트랙을 어떻게 반복할지, 무엇을 하려는지 잘 모르겠지만 jq
쿼리만으로 할 수 있는 일이 많습니다.
편집하다
한 줄에 ID, 코덱 이름, 코덱 ID 및 채널 수를 얻으려면 다음을 수행하십시오.
jq '[[.id, .codec, .properties.codec_id, .properties.audio_channels] | map(tostring) | join(",")] | join("\n")'
저장된 값(또는 원래 표현식에 추가됨)
[...]
JSON 레코드 스트림은 외부에서 캡처되고 내부적으로 목록이 구성됩니다. 목록은 [...]
숫자를 문자열로 변환한 후 join
쉼표로 편집 할 수 있으며 외부 목록도 join
줄바꿈을 사용하여 편집됩니다. 필요한 경우 명령줄 옵션을 사용하여 따옴표를 제거할 수 있다고 가정합니다.
또한 sort
먼저 채널 번호별로 정렬할지 여부 등을 고려하십시오.
이는 실제로 "이것을 올바르게 사용하려면 어떻게 해야 합니까 jq
?"라는 질문이 됩니다. 따라서 Google에서 jq
튜토리얼을 검색하거나 새로운 질문/질문을 해볼 수도 있습니다.