답변:
간단한 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
.
bash /path/to/the/script %F
-like here
-map
다른 출력 형식 (그 형식에 오디오와 비디오가 모두 포함될 수있는 경우)으로 전환 할 때 삭제 하면 여전히 비디오가 인식 될 수 있습니다. 그대로 유지하는 것이 더 안전합니다.
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에 지시합니다.
%
찾은 문자열의 첫 번째 인스턴스를 대체합니다. 변수 #
의 시작 부분 에있는 문자열 만 대체 할 수 있습니다 . 따라서 $ {0 / mp4 / m4a}는 mp4의 첫 번째 인스턴스를 m4a로 대체합니다 (실제로 이상한 파일 이름이있는 경우 문제가 될 수 있음). $ {0 / # mp4 / m4a}는 변수의 문자열 값이 mp4로 시작하는 경우에만 m4a 대신 mp4를 대체합니다 (여기서는 사용하지 않지만 다른 곳에서는 유용 할 수 있음).
여러 파일이 동시에 처리되지 않도록하려면 (많은 리소스를 사용할 수 있음)을 사용하십시오 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"
@ 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