ffmpeg 예제

비디오 파일에서 mp3 추출

비디오 파일에서 mp3를 추출하는 기본적인 명령은 아래와 같다.

$  ffmpeg -i input.mp4 output.mp3

쉘 스크립트는 아래와 같이 작성했다. id3 태그도 포함하는 예제다.

#!/usr/bin/env bash

DEST_DIR=mp3
mkdir -p $DEST_DIR
for fpath in `ls *.mp4`
do
  fname=${fpath%.*}
  file_mp3="$DEST_DIR/${fname}.mp3"
	if [ ! -f "$file_mp3" ];then
    track=`echo $fname | tr -dc 0-9 | sed 's/^0*//'`
    ffmpeg -i "$fpath" \
      -metadata title="${fname}" \
      -metadata artist="frozen"  \
      -metadata track="$track"  \
      "$file_mp3"
	fi
done

metadata로 key 목록은 위키에서 확인

Volume detect

$ ffmpeg -i input.mp3 -af "volumedetect" -f null /dev/null

# 아래와 같이 출력된다
...
[Parsed_volumedetect_0 @ 000002af8fa4b800] n_samples: 1570072
[Parsed_volumedetect_0 @ 000002af8fa4b800] mean_volume: -19.8 dB
[Parsed_volumedetect_0 @ 000002af8fa4b800] max_volume: -3.8 dB
[Parsed_volumedetect_0 @ 000002af8fa4b800] histogram_3db: 42
[Parsed_volumedetect_0 @ 000002af8fa4b800] histogram_4db: 644
[Parsed_volumedetect_0 @ 000002af8fa4b800] histogram_5db: 1520

volume up

볼륨을 3배 높이는 예는 아래와 같다.

ffmpeg.exe -i input.mp3 -filter:a "volume=3" input_up.mp3

오디오 id3 tag 넣기

오디오 재생 프로그램에서 재생할때 id3 tag가 잘 들어가 있으면 분류하기가 좋다. 아래와 같이 id3 tag를 만들었다.


EDIT_DIR=edited
mkdir -p $EDIT_DIR

artist="frozen"
for fpath in `ls *.mp3`
do
  fname=${fpath%.*}
  file_mp3="$DEST_DIR/${fname}.mp3"
	if [ ! -f "$file_mp3" ];then
    track=`echo $fname | tr -dc 0-9 | sed 's/^0*//'`
    ffmpeg -i $fpath \
      -metadata title="${fname}"  \
      -metadata artist="$artist"  \
      -metadata track="$track"    \
      $EDIT_DIR/${fname}.mp3
	fi
done

오디오 반복하기

아래와 같이 쉘 스크립트를 작성했다. 제일 위에 REPEAT변수에 설정된 숫자만큼 반복된다.

REPEAT=5
DEST_DIR=repeat${REPEAT}
mkdir -p $DEST_DIR

artist="frozen"
for fpath in `ls *.mp3`
do
  fname=${fpath%.*}
  file_mp3="$DEST_DIR/${fname}.mp3"
	if [ ! -f "$file_mp3" ];then
    track=`echo $fname | tr -dc 0-9 | sed 's/^0*//'`
    ffmpeg  \
      -lavfi "amovie=${fpath}:loop=${REPEAT}" \
      -metadata title="${fname}_r${REPEAT}"  \
      -metadata artist="$artist"  \
      -metadata track="$track"   \
     $DEST_DIR/${fname}_r${REPEAT}.mp3
	fi
done

오디오 합치기

여러 mp3를 하나로 합치고 싶다면, ffmpeg의 concat 명령을 사용할 수 있다. 아래와 같이 스크립트를 작성할 수 있다.

$  printf "file '%s'\n" ./*.mp3 > .tmp_list.txt
$  ffmpeg -f concat -safe 0 -i .tmp_list.txt -c copy output.mp3
$  rm -f .tmp_list.txt

sox 명령으로 더 간단히 가능하지만 sox는 wav 파일만 가능하다. mp3를 wav로 바꾸는 단계가 필요해서 ffmpeg이 더 간단하다.

통합 스크립트

영어공부를 하기 위해 스크립트를 만들었다.

아래의 시나리오로 만들어진 하나의 mp3를 만들고자 한다.

파일은

full/D001.mp3
D001/D001-01.mp3
D001/D001-02.mp3
D001/D001-03.mp3
D001/D001-04.mp3
D001/D001-05.mp3
D001/D001-06.mp3

그냥 파이썬이 더 나을까?

mp3 파일 trim

결론, 정말로 깔끔한 사운드가 있는 것이 아니라면, trim은 안된다

오디오 trim을 해보면서 삽질한 이유 - 노이즈 때문에

trimBeginning - 앞 무음 제거하기

ffmpeg -i input.mp3 -af \
 "silenceremove=start_periods=1:start_duration=0.1:start_threshold=-50dB" \
 out.mp3

간단히 옵션을 설명하면

trimTrailing - 뒤 무음만 제거하기

stop_periods에 1을 설정하면 된다고 하는데, 안된다. 잡음 때문에 그런 것인지.. 지금 당장은 필요하지 않아서.. 나중에 다시 시도해보자.

ffmpeg -y -i input.mp3 -af \
    "silenceremove=stop_periods=1:stop_duration=0.1:stop_threshold=-50dB" \
out.mp3

trimAll - 파일 전체영역에서 일정 소리이상이 되면 trim하기

stop_periods에 음수를 설정하면 된다. 이것저것 시도해보았다. 영어공부용 사운드 파일 만드는 작업인데.. 영어 공부용에서는 사용하면 안되겠다. 귀찮아도 audacity를 사용해야 겠다.


# 됨
ffmpeg -y -i input.mp3 -af \
 "silenceremove=stop_periods=-1:stop_duration=0.5:stop_silence=0.1:stop_threshold=-50dB" \
out.mp3

ffmpeg -y -i frozen_005.mp3 -af \
 "silenceremove=stop_periods=-1:stop_duration=0:stop_silence=1:stop_threshold=-50dB" \
out.mp3


ffmpeg -y -i D001.mp3 -af \
 "silenceremove=stop_periods=-1:stop_duration=0.3:stop_silence=0.1:stop_threshold=-50dB" \
out.mp3

ffmpeg -y -i D001.mp3 -af  "silenceremove=stop_periods=-1:stop_duration=0.1:stop_silence=1:stop_threshold=-50dB" out.mp3


ffmpeg -y -i D001.mp3 -af  \
"silenceremove=stop_periods=-1:stop_duration=0.1:stop_silence=1:stop_threshold=-50dB" \
 out.mp3


silenceremove 필터 옵션 설명