비디오에서 오디오를 추출하는 Bash 스크립트


1

avconv를 사용하여 비디오에서 오디오를 일괄 추출하기 위해이 작은 스크립트를 작성했습니다. 잘 작동했지만 이상하게 작동하지 않습니다 (코덱을 aac에서 mp3로 변경했기 때문에).

스크립트는 폴더의 각 파일을 테스트해야합니다. 비디오 인 경우 비디오에서 오디오를 추출해야합니다.

누군가이 문제를 해결하도록 도울 수 있습니까?

#!/bin/sh
#
# Batch conversion of audio extraction from video
# doesnt work with mkv files (file -i *.mkv returns application/octet)

FOLDER_SRC="/home/J/Music/TestBatchConv"

for myvid in $(find ${FOLDER_SRC})
do
    if file -i $myvid | grep -q video ;
        then avconv -i $myvid -acodec libmp3lame "${myvid}.mp3"
    fi
done

exit 0

1
무엇을하지 않습니까? 비디오를 감지하지 못합니까? avconv가 작동하지 않습니까? 오류 메시지가 있습니까?
Atle

커서가 깜박이지만 변환이나 오류 메시지가 없습니다 ... ´file -i . | grep video´는 비디오를 반환하지만 (mp4 / video charshet = binary) 아무 반응이 없습니다 ... 이제 grep | mp4 그러나 동일 : 커서가 깜박이고 오류가 없습니다 ...
riimzzai

답변:


3

당신은 이전 버전 사용하고있는 것 같은데 file어디 MKV 파일이 제대로 검출되지 않았다을 . ~/.magic파일 을 사용 하여file MKV를 식별 할 수 있습니다 .

그러나 실제로 유효한 비디오 파일을 확인하는 가장 안정적인 방법은 실행 avconv하여 실패 여부를 확인하는 것입니다. 수행 할 수있는 작업은 다음과 같습니다.

#!/bin/bash
FOLDER_SRC="/home/J/Music/TestBatchConv"
find "$FOLDER_SRC" -type f -print0 | while IFS= read -r -d '' myvid; do
  echo "Trying to convert $myvid"
  avconv -i "$myvid" -c:a libmp3lame -q:a 4 "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done

파일이 유효한 비디오가 아니거나 오류가 있으면 avconv어쨌든 종료됩니다.

몇 가지 팁과 설명 :

  • 없다 의 출력을 구문 분석 할 필요 ls하거나find . 간단히 for myvid in "$FOLDER_SRC"/*또는 재귀 버전의 경우 **glob를 globstar옵션 과 함께 사용하십시오 . 여기에서 해당 find … | while …줄을 다음과 같이 바꿀 수 있습니다.

    shopt -s globstar
    for myvid in "$FOLDER_SRC/**"; do
  • "$myvid"루프에서 사용할 때마다 정확하게 인용 해야합니다. 그렇지 않으면 이름에 공백이있는 비디오가 스크립트를 손상시킵니다.

  • 마지막 점 뒤에있는 것을 제거하여 원본 파일 확장명을 제거 ${myvid%.*}하고로 바꿀 수 있습니다 .mp3.
  • 당신은 말해야 avconv사용하는 가변 비트 전송률 인코딩 을 위해 libmp3lame함께 예를, -q:a 4값이 0-10에 이르기까지, 4가 기본 인 상태. 이것은 일반적으로 더 나은 오디오 품질을 제공합니다.

다시 한 번 감사하지만 4.2.25(1)-release and /home/J/Music/TestBatchConv/ is not a valid file.파일 테스트가 발생하지 않는 경우와 마찬가지로 sry 만 있습니다. 네 나는 이것에 멍청한 ^^
riimzzai

루프가 변환 폴더를 가져 오는 것 같습니다. 예를 들어 올바른 glob를 사용 "$FOLDER_SRC"/**하면 폴더 자체는 포함되지 않습니다. **글로브 를 사용하는 경우 발견 된 모든 항목이 실제로 파일인지 확인하면됩니다. 올바른 경로를 사용하고 있는지 확인하십시오 (확인하기 echo "$myvid"위해 루프에 추가 할 수 있음). 내가 준 스크립트를 사용하지 않는 경우 이제 스크립트가 정확히 어떻게 보이는지 보여주세요.
slhck

나는 당신이 (찾기없이) 제안하는 방식을 정확하게 변경했으며 작동합니다. 해결되지 않은 두 가지 문제가 있습니다 : 1) 폴더 자체가 테스트되고 (와 함께 "$FOLDER_SRC"/**) 2) 더 이상 avconv 메시지가 없습니다 (그리고 그 점이 나를 착각했습니다)
riimzzai

VBR은 2 세대 iPod에서 노래를 사용하고 싶기 때문에 적합하지 않습니다 (ipod에서 노래를 탐색 할 수없는 한 libav를 사용하여 VBR로 인코딩 할 때 문제가 있음)
riimzzai

아 그래 로 avconv출력 을 억제하는 것을 생각 했습니다 2>/dev/null. 모든 정보를 원하면 해당 부분을 제외하십시오.
slhck

0

여기에 관심이있는 사람들을 위해 최종 작업 코드가 있습니다.

#!/bin/bash
#
# Batch conversion of audio extraction from video

echo $BASH_VERSION
FOLDER_SRC="/home/J/Music/TestBatchConv"

shopt -s globstar

for myvid in "$FOLDER_SRC"/**
do
  echo "$myvid"
  avconv -i "$myvid" -acodec libmp3lame "${myvid%.*}.mp3" 2>/dev/null || echo "$myvid is not a valid file."
done
exit 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.