특정 트랙 ID에 대한 오디오 채널, 비트 전송률 및 기타 품질 측정을 검색하는 방법

특정 트랙 ID에 대한 오디오 채널, 비트 전송률 및 기타 품질 측정을 검색하는 방법

나는 이 코드를 가지고 있습니다 :

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, mkvmergemediainfo은(는) 특정 트랙 ID에 대한 정보를 검색할 수 없는 것 같습니다. 필요한 정보만 검색하기 위해 전체 출력을 구문 분석하는 방법을 모르겠습니다.

어떻게 해야 하나요? 형식, 비트 전송률, 채널 수, 크기 등 품질을 추측하는 데 필요한 모든 것을 검색하여 track1channels.

나는 이 퍼즐에 대한 다른 해결책을 찾고 있습니다.

답변1

출력을 구문 분석하는 데 사용하려는 도구에 따라 이를 수행하는 방법은 여러 가지가 있을 수 있습니다. 한 가지 방법은 mkvmergeJSON을 생성한 다음 를 사용하여 jq모든 오디오 트랙을 얻는 것입니다.

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

트랙 2 등 jq다양한 조건을 에서 지정할 수 있습니다. 수행하려는 작업에 따라 를 .id=="2"사용하여 비교/정렬할 수도 있습니다. 자세한 내용은 을 참조하세요.jqman jq

jq필터링된 일부 출력을 쉘 변수에 저장 하고 여러 jq호출을 사용하여 모든 필드를 다른 쉘 변수로 추출할 수도 있습니다. (병렬 접근 방식이 있을 수 있지만 잘 모르겠습니다.)

편집하다

비트 전송률에 관해서는: 오디오가 mkv포함된 샘플을 시도했지만 처음부터 순수한 오디오 비트 전송률을 제공하지 않았습니다. 트랙에서 사용된 총 비트 수 및 총 지속 시간과 같은 다른 정보를 기반으로 이를 계산할 수도 있지만, 어떤 숫자가 어느 숫자인지 파악하기에는 mkv 컨테이너의 내부에 대해 충분히 익숙하지 않습니다.AACmediainfomkvinfo

.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튜토리얼을 검색하거나 새로운 질문/질문을 해볼 수도 있습니다.

관련 정보