트랜스 코딩없이 avconv로 일괄 추출 오디오


14

약 70 mp4 파일이 있으며 더 이상 트랜스 코딩하지 않고 오디오 파일을 직접 추출하고 싶습니다. 모든 mp4 파일에는 aac 오디오 파일이 있습니다.

다음 명령을 사용하여 mp4 파일 중 하나에서 오디오 파일을 추출 할 수 있음을 이해합니다.

avconv -i "INPUT FILE" -map 0:1 -c:a copy "OUTPUT FILE"

모든 70 mp4 파일에서 모든 오디오 파일을 추출하려면 어떻게 70 aac 파일을 사용해야합니까?

답변:


21

간단한 for 루프를 사용할 수 있습니다.

for i in *.mp4; do
    avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"
done

또는 한 줄에 :

for i in *.mp4; do avconv -i "${i}" -map 0:1 -c:a copy "${i%.mp4}.aac"; done

avconv파일 이름 *.mp4${i}변수에 저장되는 것과 같이 이름이 지정된 모든 파일에 대해 한 번 실행 됩니다 .

${i%.mp4}끝에서 벗겨진 것을 의미합니다 ${i}(예 : 파일 이름) .mp4.


2
IIRC, 원시 aac 파일은 메타 데이터를 포함 할 수 없습니다. 원본 파일에서 메타 데이터를 유지하려면 aac 대신 m4a (mp4의 또 다른 이름이지만 오디오 플레이어에서 상당히 널리 인식됨)를 파일 확장자로 사용하십시오.
evilsoup

-map 옵션은 무엇입니까? 0 : 0, 0 : 2와 같은 다른 스트림 대신 0 : 1 스트림을 선택하는 이유는 무엇입니까?
qed

-map 옵션을 삭제하고 제대로 작동합니다.
Qed

Thunar 사용자 정의 조치 및 이와 유사한 명령에서이 명령을 사용하려면 스크립트 및 Thunar 조치에 추가 된 경우 작동합니다. bash /path/to/the/script %F-like here

2
@qed : -map다른 출력 형식 (그 형식에 오디오와 비디오가 모두 포함될 수있는 경우)으로 전환 할 때 삭제 하면 여전히 비디오가 인식 될 수 있습니다. 그대로 유지하는 것이 더 안전합니다.
박사. Sybren

5

Xiao의 답변은 일반적으로 모든 파일이 하나의 디렉토리에있는 경우 가장 유용합니다. 그러나 다른 디렉토리에 MP4 파일이 흩어져 있으면이 find명령을 사용 하여 모두 변환 할 수 있습니다 .

find . -type f -name '*.mp4' -exec bash -c 'avconv -i "$0" -c:a copy "${0/%mp4/m4a}"' {} \;

이것은 끝에 약간 다른 형태의 bash 문자열 치환을 사용합니다 : "$ {0 / % mp4 / m4a}"는 bash가 mp4를 m4a로 바꾸도록 지시하지만 mp4가 문자열의 끝에있는 경우에만 bash에 지시합니다.


나는 배쉬가 그런 유형의 대체물을 가지고 있다는 것을 결코 알지 못했다. : :
Andrew Gunnerson

1
@xiao을 생략하면 %찾은 문자열의 첫 번째 인스턴스를 대체합니다. 변수 #시작 부분 에있는 문자열 만 대체 할 수 있습니다 . 따라서 $ {0 / mp4 / m4a}는 mp4의 첫 번째 인스턴스를 m4a로 대체합니다 (실제로 이상한 파일 이름이있는 경우 문제가 될 수 있음). $ {0 / # mp4 / m4a}는 변수의 문자열 값이 mp4로 시작하는 경우에만 m4a 대신 mp4를 대체합니다 (여기서는 사용하지 않지만 다른 곳에서는 유용 할 수 있음).
evilsoup

3

여러 파일이 동시에 처리되지 않도록하려면 (많은 리소스를 사용할 수 있음)을 사용하십시오 parallel. 기본적으로 한 번에 하나의 작업 만 수행합니다. 여러 개의 CPU 코어를 병렬로 사용하려면 parallel -j 4 ...4 개의 작업을 병렬로 시도하십시오 . 또한 확인하십시오 man parallel.

sudo apt-get install parallel

이 줄은 aac선택한 비디오에서 오디오 파일을 추출 하여 m4a컨테이너에 넣습니다 .

parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F

CLI에서 바로 작업 할 때는 %F입력 파일 목록으로 대체 하십시오. 예 *.mp4.

답변, 질문에 대한 이전 답변 및 후자에 대한 evilsoup 의 의견에서 영감을 얻었습니다 (예 : 'raw aac 파일은 메타 데이터를 포함 할 수 없습니다. 원래 파일에서 메타 데이터를 유지하려면 m4a ( 는 mp4의 또 다른 이름이지만 aac 대신 파일 확장자로 오디오 플레이어에서 상당히 널리 인식됩니다 ' ).

Thunar 사용자 지정 작업에서 이러한 명령을 사용합니다.

여기에 이미지 설명을 입력하십시오

aac오디오 가 포함 된 비디오로 응용 프로그램을 제한합니다 .

여기에 이미지 설명을 입력하십시오

처리 중에 터미널 창이 열려 종료되도록하려면 명령을 다음과 같이 변경할 수 있습니다.

 gnome-terminal -e "parallel avconv -i '{}' -map 0:1 -c:a copy '{.}.m4a' ::: %F"

2

@ Xiao-Long Chen의 답변을 확장하여 출력 파일이 최신 일 때 파일을 건너 뛰는 스크립트로 변환했습니다.

#!/bin/bash

for file in *.mp4; do
    OUT="${file/.mp4/.m4a}"

    if [ "$file" == "$OUT" ]; then
        echo "Unable to handle $file" >&2
        exit 1
    fi

    if [ "$OUT" -nt "$file" ]; then
        echo "Skipping $file; output file is newer."
        continue
    fi

    echo "Converting \"$file\" -> \"$OUT\""
    avconv -loglevel warning -i "$file" -map 0:1 -c:a copy "$OUT"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.