압축 해제없이 ffmpeg를 사용하여 mp4 파일에서 오디오를 일괄 추출하려면 어떻게해야합니까 (자동 오디오 코덱 감지)?


19

228 개의 mp4 파일 (2.6GB)이 있고 그로부터 오디오를 추출하고 싶습니다 (mp3 또는 ogg). 나는 바람직하게 bash로 배치 추출을 원합니다. 모든 파일이 2006-2012 년에 걸쳐 서로 다른 연도에 기록 된 것과 동일한 오디오 코덱을 사용하는지 확실하지 않습니다.

모든 파일을 반복하고 파일 이름을 선택하고 오디오 코덱을 감지하고 ffmpeg를 사용하여 오디오를 추출하고 싶습니다.

가능합니까?


이것은 스크립팅 질문이며 우분투와는 아무런 관련이 없습니다. 여기서는 주제가 아니지만 SO 또는 unix.SE가 더 나은 곳입니다.
Mahesh

감사. 다음에 더 적절한 장소에서 그런 질문을하려고합니다.
wryrych

답변:


28

"오디오에서 오디오를 추출합니다 (mp3 또는 ogg)"라고 말합니다. 그러나 mp4 파일의 오디오가 그중 하나가 아닌 경우 어떻게해야합니까? 어쨌든 트랜스 코딩해야합니다. 그렇다면 오디오 형식 감지 기능을 ffmpeg로 유지하지 않으시겠습니까?

하나의 파일을 변환하려면

ffmpeg -i videofile.mp4 -vn -acodec libvorbis audiofile.ogg

많은 파일을 변환하려면

for vid in *.mp4; do ffmpeg -i "$vid" -vn -acodec libvorbis "${vid%.mp4}.ogg"; done

물론 비트 레이트 등을 설정하기 위해 원하는 오디오 인코딩에 대한 ffmpeg 매개 변수를 선택할 수 있습니다.

사용 -acodec libmp3lame에서 확장자를 변경 .ogg하는 .mp3MP3 인코딩.

원하는 오디오 를 실제로 추출 하려면을 사용하여 오디오 트랙을 파일로 "복사"하면됩니다 -acodec copy. 물론, 주요 차이점은 트랜스 코딩이 느리고 CPU를 많이 사용한다는 것입니다. 한 파일에서 다른 파일로 바이트를 옮기는 것만으로도 복사가 빠릅니다. 다음은 오디오 트랙 만 복사하는 방법입니다 (mp3 형식이라고 가정).

ffmpeg -i videofile.mp4 -vn -acodec copy audiofile.mp3

이 경우, audiofile 형식이 있습니다 컨테이너가 무슨과 일치하도록 (오디오는 AAC 형식 인 경우 즉, 당신은 말할 필요 audiofile.aac). 이 ffprobe명령을 사용하여 사용 중인 코덱을 확인할 수 있습니다.이 정보는 다음과 같습니다.

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "videofile.mp4"

오디오 코덱을 자동으로 구문 분석하고 그에 따라 오디오 파일 이름을 지정하는 가능한 방법은 다음과 같습니다.

mkdir -p output
# current directory has to contain at least one .mp4 file 
for vid in *.mp4; do
   codec="$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -print_format csv=p=0 "$vid")"
   case "$codec" in
    mp3    ) filetype=mp3 ;;
    vorbis ) filetype=ogg ;;
    *      ) filetype= ;;
   esac

   if [ "$filetype" ]; then 
    ffmpeg -i "$vid" -vn -acodec copy output/"${vid%.*}"."$filetype"
   else
    ffmpeg -i "$vid" -vn -acodec libvorbis output/"${vid%.*}".ogg
done

주 : 출력 파일은 output처음에 작성하는 서브 디렉토리 에 작성됩니다 (필요한 경우). mp3 및 vorbis 이외의 코덱의 경우 오디오를 ogg로 변환합니다. Ubuntu 14.04에는 표준 리포지토리에 ffmpeg가 없지만 ppa : mc3man / trusty-media 리포지토리를 추가하고 ffmpeg 패키지를 설치하여 필요한 소프트웨어를 얻을 수 있습니다. 자세한 내용은 여기 를 참조 하십시오 .


나는 그것을 잘못 넣었다. mp3 또는 ogg를 원했지만 오디오 코덱이 다르다는 것을 알았습니다.이 예에서는 aac입니다. 어쨌든 그것들을 코드 변환해야합니다. 당신의 도움을 주셔서 대단히 감사합니다!
wryrych

ffprobe 하위 명령문에서 $ file을 인용하지 않았기 때문에 automagic 예제는 공백이있는 파일 이름으로 구분됩니다. 다음으로 변경 : * mp4 파일의 경우 * avi; ffmpeg -i "$ file"-vn -acodec copy "$ file"을 수행하십시오. ffprobe "$file" 2>&1 |sed -rn 's/.*Audio: (...), .*/\1/p'; done 수정합니다.
앤드류 Beals

+1이지만이 답변이 업데이트를 사용할 수있는 것 같습니다 :This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Nicolas Raoul

ffmpeg또는 ffprobe나중에 우분투 14.04 또는 사용할 수 없습니다.
jarno

1
@jarno 진짜 ffmpeg 15.04에서 우분투로 돌아 , 그리고 그것은 Libav 왕겨처럼 보이는 avconv하고 avprobe있다 15.10에서 제거 .
llogan

1

Nicolas Raoul이 말했듯이 업데이트가 필요합니다. 다음은 roadmr이 제공했지만 avconv를 대신 사용하는 것과 동일한 줄입니다.

for vid in *.mp4; do avconv -i "$vid" "${vid%.mp4}.mp3"; done


이것은 구식입니다. FFmpeg가 돌아 왔고 Libav가 사라졌습니다.
llogan

절대적으로 맞습니다. ffmpeg가 죽을 것이라고 생각한 사람이 있다면 다음을 읽으십시오. en.wikipedia.org/wiki/Libav#Confusion
Scooby-2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.