FFmpegで音声ファイルと画像1枚から動画を作成してみた

はじめに

清水です。先日ひょんなことから音声のみのmp3ファイルをYouTubeにアップロードすることがありました。 しかしYouTubeで音声のみのファイルをアップロードすることはできず、アップロードしようとすると以下の画面のように変換を促されます。

ffmpeg-create-movie-by-audio-001-1

YouTubeにアップロードするには別途映像部分と合成しなければなりません。YouTubeのヘルプページには、

  • Windowsユーザ向け: Windows Live ムービーメーカーの使用
  • Macユーザ向け: iMovieの使用
  • Youtubeのスライドショーでの動画作成

などの方法での変換方法が紹介されています。 が、映像部分はこったものである必要はなく、写真1枚の静止画状態で十分、という具合でした。そのために動画編集するのもな、、、と思いましたので、FFmpegで音声ファイル+静止画1枚からの動画を作成し、YouTueにアップロードしてみました。

本エントリではこの過程において、

  • Amazon LinuxへのFFmpegのインストール方法
  • FFmpegでの音声ファイル+静止画1枚からYouTubeにアップロードできる動画の作成方法

の2点をまとめてみました。

Amazon LinuxへのFFmpegのインストール方法

まずはAmazon LinuxへFFmpegをインストールして使用できるようにします。Amazon Linuxは現時点での最新版(2016.09.1)を使用しています。

手順としてはFFmpegの公式ページのCentOSへのコンパイル方法を踏襲して行います。

yumで依存関係にあるパッケージをいくつかインストールした後に、必要なライブラリならびにFFmpeg本体をインストールする、という流れなのですが、この作業をまとめて1つのスクリプトとしてみました。このスクリプトは本エントリの最後にまとめています。

また公式ドキュメントでは~/ffmpeg_sourcesなどホームディレクトリ配下へのインストールを想定していますが、/usr/local/配下へインストールするようにしています。こちらは冒頭の変数を書き換えることで変更可能です。

Amazon Linuxを起動した後、適切な権限でこのスクリプトファイルを実行します。(例えば/usr/local配下にインストールする場合はroot権限が必要となりますのでsudoで実行します。) なお、コンパイルにはそれなりに時間がかかりますのでご注意ください。

コンパイルが終了したら、ffmpegコマンドを実行して動作するか確認します。

[ec2-user@ip-172-31-17-78 ~]$ ffmpeg
ffmpeg version N-82976-g7525517 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-9)
  configuration: --prefix=/usr/local/build/ffmpeg_build --extra-cflags=-I/usr/local/build/ffmpeg_build/include --extra-ldflags='-L/usr/local/build/ffmpeg_build/lib -ldl' --bindir=/usr/local/bin --pkg-config-flags=--static --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
  libavutil      55. 43.100 / 55. 43.100
  libavcodec     57. 70.100 / 57. 70.100
  libavformat    57. 61.100 / 57. 61.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 68.100 /  6. 68.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

FFmpegでの音声ファイルと静止画1枚からの動画の作成方法

FFmpegが利用できるようになったら、音声ファイルと静止画1枚の画像ファイルを用意して、動画を作成します。

今回の動画作成のために使用したコマンドは以下となります。

ffmpeg \
    -loop 1 \
    -r 30000/1001 \
    -i input_picture.png -i input_audio.mp3 \
    -vcodec libx264 \
    -acodec aac -strict experimental -ab 320k -ac 2 -ar 48000 \
    -pix_fmt yuv420p \
    -shortest \
    output.mp4

なかなか長いですね。。。それぞれオプションを確認すると以下のようになります。

-loop 1
静止画1枚の画像を繰り返して動画にします
-r 30000/1001
フレームレートを指定します。29.97fpsにしています
-i input_picture.png -i input-audio.mp3
入力ファイルを指定します。それぞれ画像(静止画)ファイル、音声ファイルです
-vcodec libx264
動画フォーマットを指定します。H.264にしています
-acodec aac -strict experimental -ab 320k -ac 2 -ar 48000
音声フォーマットを指定しています。AACで320kbps、2チャンネル、サンプリングレート48kHzとしています
-pix_fmt yuv420p
出力動画の画素フォーマットを指定します
-shortest
動画の長さを入力ソースが最短のもの(ここでは音声ファイル)に合わせます
output.mp4
最後に出力ファイルの名称を入力します

エンコードしたファイルのYouTubeへのアップロード

エンコードができたら、ファイルを確認してYouTubeにアップロードしましょう。

アップロードは通常の手順と同様にできます。音声のみのファイルのときに出ていた動画ファイルへの変換を促すメッセージも表示されませんね。タイトルなどの情報や公開範囲、必要に応じて詳細設定を入力して公開しましょう。

YoutubeUpload2-1

実際にアップロードしてみたサンプル動画

本エントリの手順で実際にYouTubeアップロード、公開してみた動画が下記になります!

YouTubeで公開されている「動画」なのですが、映像としては静止画1枚がループしている状態であることがご確認いただけます。

まとめ

Amazon LinuxにFFmpegをインストールし、音声ファイルと1枚の静止画ファイルから動画を作成してみました。

実は数年前にもまったく同じことをFFmpegで行ったことがあるのですが、FFmpegのオプションについて記録しておらず、今回やってみるにあたりこの調査などにわりと時間をとられてしまいました。FFmepgはオプション等の指定が慣れていないとやや難しい点がありますが、こんな感じで使用実績ベースで記録にまとめて、使い方を覚えていければなと思います。

FFmpegインストール用スクリプト

本エントリで使用した、Amazon LinuxへのFFmpegインストール用のスクリプトを以下にまとめます。Amazon Linux 2016.09.1で動作を確認しています。また/usr/local/へのインストールを行ないますので適切な権限での実行が必要となります。

#!/bin/sh

## source directory
SOURCE_DIR="/usr/local/src/ffmpeg_sources"

## build directory
BUILD_DIR="/usr/local/build/ffmpeg_build"

## install directory
INSTALL_DIR="/usr/local/bin"

## export PATH
PATH=${INSTALL_DIR}':'${PATH}


## Get the Dependencies
yum install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel
mkdir ${SOURCE_DIR}


## Compilation & Installation

### Yasm
cd ${SOURCE_DIR}
git clone --depth 1 git://github.com/yasm/yasm.git
cd yasm
autoreconf -fiv
./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}"
make
make install
echo

### libx264
cd ${SOURCE_DIR}
git clone --depth 1 git://git.videolan.org/x264
cd x264
PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}" --enable-static
make
make install
echo

### libx265
cd ${SOURCE_DIR}
hg clone https://bitbucket.org/multicoreware/x265
cd ${SOURCE_DIR}/x265/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="${BUILD_DIR}" -DENABLE_SHARED:bool=off ../../source
make
make install
echo

### libfdk_aac
cd ${SOURCE_DIR}
git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="${BUILD_DIR}" --disable-shared
make
make install
echo

### libmp3lame
cd ${SOURCE_DIR}
curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xzvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}" --disable-shared --enable-nasm
make
make install
echo

### libopus
cd ${SOURCE_DIR}
git clone http://git.opus-codec.org/opus.git
cd opus
autoreconf -fiv
PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --disable-shared
make
make install
echo

### libogg
cd ${SOURCE_DIR}
curl -O http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
tar xzvf libogg-1.3.2.tar.gz
cd libogg-1.3.2
./configure --prefix="${BUILD_DIR}" --disable-shared
make
make install
echo

### libvorbis
cd ${SOURCE_DIR}
curl -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz
tar xzvf libvorbis-1.3.4.tar.gz
cd libvorbis-1.3.4
./configure --prefix="${BUILD_DIR}" --with-ogg="${BUILD_DIR}" --disable-shared
make
make install
echo

### libvpx
cd ${SOURCE_DIR}
git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
cd libvpx
./configure --prefix="${BUILD_DIR}" --disable-examples
make
make install
echo

### FFmpeg
cd ${SOURCE_DIR}
curl -O http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --extra-cflags="-I${BUILD_DIR}/include" --extra-ldflags="-L${BUILD_DIR}/lib -ldl" --bindir="${INSTALL_DIR}" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
make
make install
hash -r