motionのWebMパッチをコンパイルする

どうしてもmotionのWebM対応を行いたく、探していたらこちらのサイトで確認できました。
http://www.lavrsen.dk/foswiki/bin/view/Motion/WebMVP8Codec

早速、パッチ対応済みのソースをダウンロードしました。

# git clone https://github.com/jthetzel/motion.git
remote: Counting objects: 2748, done.
remote: Total 2748 (delta 0), reused 0 (delta 0), pack-reused 2748
Receiving objects: 100% (2748/2748), 2.52 MiB | 759 KiB/s, done.
Resolving deltas: 100% (2003/2003), done.

# cd motion
# ./configure

**********************************************
* libavcodec.a or libavcodec.so or           *
* libavformat.a or libavformat.so not found: *
*    ALL FFMPEG FEATURES DISABLED            *
*                                            *
* Please read the Motion Guide for help:     *
* http://motion.sourceforge.net              *
**********************************************

OS             :     Linux
pthread support:     Yes
jpeg support:        No
**********************************************
** Fatal Error YOU MUST HAVE jpeg Support  ***
**********************************************
V4L support:         Yes
V4L2 support:        Yes
SDL support:         No
FFmpeg support:      No
SQLite3 support:     No
MYSQL support:       No
PostgreSQL support:  No

**********************************************
* libavcodec.a or libavcodec.so or *
* libavformat.a or libavformat.so not found: *
* ALL FFMPEG FEATURES DISABLED *
* *
* Please read the Motion Guide for help: *
* http://motion.sourceforge.net *
**********************************************
というメッセージが表示されている。とりあえずlibavcodec-dev,libavformat-devをインストールする。

# apt-get install deb-multimedia-keyring
# vi /etc/apt/sources.list
deb http://www.deb-multimedia.org wheezy main non-free
deb http://www.deb-multimedia.org wheezy-backports main

# apt-get update; apt-get install libavcodec-dev libavformat-dev

しかしこのメッセージは消えない…
FFmpegのバージョンを確認する

# ffmpeg -h
ffmpeg version 1.2.12 Copyright (c) 2000-2015 the FFmpeg developers
  built on Feb 12 2015 17:53:54 with gcc 4.7 (Debian 4.7.2-5)

1.2系のffmpegでは最新のようですが、とりあえず保留にします。

ほかにFatal Error YOU MUST HAVE jpeg Supportというメッセージが表示され、エラーとなりました。

# apt-get install libjpeg-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ libjpeg-turbo-devel が見つかりません
root@460-Linux:~/motion# apt-get install libjpeg-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
注意、'libjpeg-dev' の代わりに 'libjpeg8-dev' を選択しています
以下の特別パッケージがインストールされます:
  libjpeg8
以下のパッケージが新たにインストールされます:
  libjpeg8-dev
以下のパッケージはアップグレードされます:
  libjpeg8
アップグレード: 1 個、新規インストール: 1 個、削除: 0 個、保留: 186 個。
370 kB のアーカイブを取得する必要があります。
この操作後に追加で 490 kB のディスク容量が消費されます。
続行しますか [Y/n]? Y
取得:1 http://ftp.jp.debian.org/debian/ wheezy/main libjpeg8 i386 8d-1+deb7u1 [134 kB]
取得:2 http://ftp.jp.debian.org/debian/ wheezy/main libjpeg8-dev i386 8d-1+deb7u1 [236 kB]
370 kB を 3秒 で取得しました (96.2 kB/s)
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 107891 個のファイルとディレクトリがインストールされています。)
libjpeg8:i386 8d-1 を (.../libjpeg8_8d-1+deb7u1_i386.deb で) 置換するための準備 をしています ...
libjpeg8:i386 を展開し、置換しています...
以前に未選択のパッケージ libjpeg8-dev:i386 を選択しています。
(.../libjpeg8-dev_8d-1+deb7u1_i386.deb から) libjpeg8-dev:i386 を展開しています...
libjpeg8:i386 (8d-1+deb7u1) を設定しています ...
libjpeg8-dev:i386 (8d-1+deb7u1) を設定しています ...

ffmpeg関係以外は問題なく動作するが、どうしても動画保存ができない…

[0] [NTC] [ALL] conf_load: Processing thread 0 - config file /etc/motion/motion.conf
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_output_movies"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_output_debug_movies"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_timelapse"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_timelapse_mode"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_bps"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_variable_bitrate"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_video_codec"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "ffmpeg_deinterlace"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "sdl_threadnr"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "movie_filename"
[0] [ALR] [ALL] conf_cmdparse: Unknown config option "timelapse_filename"

libvpxをインストールする。意外と長いです。

# git clone https://github.com/webmproject/libvpx.git
Cloning into 'libvpx'...
remote: Counting objects: 88344, done.
remote: Compressing objects: 100% (76/76), done.
remote: Total 88344 (delta 37), reused 0 (delta 0), pack-reused 88268
Receiving objects: 100% (88344/88344), 26.96 MiB | 693 KiB/s, done.
Resolving deltas: 100% (71954/71954), done.
# cd libvpx
# ./configure
# make
# make install

またはパッケージを使う場合

# apt-get install libvpx-dev

最新版のffmpegをダウンロードしてソースからコンパイルすることにした。(libavは含まれているようようです)

# apt-get install yasm nasm pkg-config
# wget http://ffmpeg.org/releases/ffmpeg-2.6.1.tar.bz2
# tar jxvf ffmpeg-2.6.1.tar.bz2
# cd ffmpeg-2.6.1
# ./configure --enable-gpl --enable-nonfree --enable-libvpx --enable-shared --enable-pthreads
# make
# make install

長時間ffmpegのコンパイルが完了し、motionのコンパイルを行う。

# cd motion
# ./configure 
# make
Linking Motion...
--------------------------------------------------------------------------------
gcc -L/usr/local/lib -o motion motion.o logger.o conf.o draw.o jpegutils.o vloopback_motion.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o stream.o md5.o ffmpeg.o sdl.o netcam_rtsp.o -lm  -lpthread -L/usr/lib/i386-linux-gnu -lSDL -ljpeg -L/usr/local/lib -lavformat -lavcodec -lavutil -lm -lz
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_subpacket':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:374: undefined reference to `swr_is_initialized'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_frame':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:220: undefined reference to `swr_is_initialized'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_init_resample':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:161: undefined reference to `swr_init'
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:167: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_frame':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:234: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_flush_resample':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:115: undefined reference to `swr_convert'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_subpacket':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:406: undefined reference to `swr_close'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_flush':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:567: undefined reference to `swr_close'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_close':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:589: undefined reference to `swr_free'
/usr/local/lib/libavcodec.a(opusdec.o): In function `opus_decode_init':
/root/ffmpeg-2.6.1/libavcodec/opusdec.c:642: undefined reference to `swr_alloc'
/usr/local/lib/libavcodec.a(vaapi.o): In function `ff_vaapi_commit_slices':
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:101: undefined reference to `vaCreateBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:110: undefined reference to `vaCreateBuffer'
/usr/local/lib/libavcodec.a(vaapi.o): In function `ff_vaapi_render_picture':
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:52: undefined reference to `vaUnmapBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:65: undefined reference to `vaBeginPicture'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:69: undefined reference to `vaRenderPicture'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:73: undefined reference to `vaRenderPicture'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:78: undefined reference to `vaEndPicture'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:61: undefined reference to `vaUnmapBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:56: undefined reference to `vaUnmapBuffer'
/usr/local/lib/libavcodec.a(vaapi.o): In function `alloc_buffer':
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:129: undefined reference to `vaCreateBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:131: undefined reference to `vaMapBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:129: undefined reference to `vaCreateBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:131: undefined reference to `vaMapBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:129: undefined reference to `vaCreateBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:131: undefined reference to `vaMapBuffer'
/usr/local/lib/libavcodec.a(vaapi.o): In function `destroy_buffers':
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:38: undefined reference to `vaDestroyBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:38: undefined reference to `vaDestroyBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:38: undefined reference to `vaDestroyBuffer'
/root/ffmpeg-2.6.1/libavcodec/vaapi.c:38: undefined reference to `vaDestroyBuffer'
collect2: error: ld returned 1 exit status

なぜかリンク時に関数名がない…どうしてだろう…
ライブラリがリンクされているか、確認する。

# ldd `which ffmpeg`
linux-vdso.so.1 => (0x00007fff567ea000)
libavdevice.so.55 => not found
libavfilter.so.3 => not found
libavformat.so.55 => not found
libavcodec.so.55 => not found
libpostproc.so.52 => not found
libswresample.so.0 => not found
libswscale.so.2 => not found
libavutil.so.52 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f28f09fa000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f28f07dd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f28f0415000)
/lib64/ld-linux-x86-64.so.2 (0x00007f28f0d1c000)

ldconfigでリンクされる。

# ldconfig
# ldd `which ffmpeg`
linux-gate.so.1 =>  (0xb773e000)
libavdevice.so.56 => /usr/local/lib/libavdevice.so.56 (0xb7716000)
libavfilter.so.5 => /usr/local/lib/libavfilter.so.5 (0xb75d9000)
libavformat.so.56 => /usr/local/lib/libavformat.so.56 (0xb73e4000)
libavcodec.so.56 => /usr/local/lib/libavcodec.so.56 (0xb6282000)
libpostproc.so.53 => /usr/local/lib/libpostproc.so.53 (0xb6256000)
libswresample.so.1 => /usr/local/lib/libswresample.so.1 (0xb623a000)
libswscale.so.3 => /usr/local/lib/libswscale.so.3 (0xb61b1000)
libavutil.so.54 => /usr/local/lib/libavutil.so.54 (0xb613c000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6004000)
libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb5fde000)
libvdpau.so.1 => /usr/lib/i386-linux-gnu/libvdpau.so.1 (0xb5fd9000)
libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb5fc0000)
libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb5e5b000)

その後makeを行い正常に終了する。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください