AirVideoのためにUbuntu 12.04 LTSにてmp4creator(mpeg4ip)をビルドする

AirVideo For Linuxを動作させるためにmp4creatorが必要になるのだが、Ubuntu 12.04 LTSではmp4creatorが入っているパッケージが存在しない。よって、何処からかパッケージを持ってくるか、自分でビルドする必要がある。ビルドしようとすると色々ハマる。

installは行わずに、AirVideoの設定(properties)にて直接パスを指定して、利用する。

buildに必要なパッケージは入っている事とする。
mp4liveやv4l2はいらない。

$ sudo aptitude install bzr
$ bzr branch lp:ubuntu/precise/mpeg4ip
$ cd mpeg4ip
$ cat debian/patches/* | patch -p1
$ ./configure --prefix=/usr --disable-alsatest --disable-player
$ make

途中で止まる。

make[3]: ディレクトリ `/tmp/mpeg4ip/lib/rtp' に入ります
if /bin/bash ../../libtool --mode=compile --tag=CC gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../../lib/utils   -DDEBUG -Wall -Werror -g -O2 -DMPEG4IP -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -MT net_udp.lo -MD -MP -MF ".deps/net_udp.Tpo" -c -o net_udp.lo net_udp.c; \
        then mv -f ".deps/net_udp.Tpo" ".deps/net_udp.Plo"; else rm -f ".deps/net_udp.Tpo"; exit 1; fi
 gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../../lib/utils -DDEBUG -Wall -Werror -g -O2 -DMPEG4IP -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -MT net_udp.lo -MD -MP -MF .deps/net_udp.Tpo -c net_udp.c  -fPIC -DPIC -o .libs/net_udp.o
net_udp.c: In function 'socket_error':
net_udp.c:166:11: error: variable 'retlen' set but not used [-Werror=unused-but-set-variable]
cc1: all warnings being treated as errors
  • Werrorによってwarningが出たらエラーになり止る設定になっている。

lib/rtp/Makefileの328行目のWerrorを消して再度、make。

今度はmpeg2psで止まる。

g++ -D_REENTRANT -Wall -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2 -Wpointer-arith -Wsign-compare -fno-strict-aliasing -g -O2 -DMPEG4IP -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -o .libs/mpeg_ps_info ps_info.o  ../../lib/gnu/.libs/libmpeg4ip_gnu.so ../../lib/mp4av/.libs/libmp4av.so ../../lib/mp4v2/.libs/libmp4v2.so ./.libs/libmpeg2_program.a -ldl -Wl,--rpath -Wl,/usr/lib
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `get_info_from_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1014: undefined reference to `h264_nal_unit_type'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1024: undefined reference to `h264_find_next_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1014: undefined reference to `h264_nal_unit_type'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1017: undefined reference to `h264_read_seq_info'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1060: undefined reference to `MP4AV_Mp3HeaderFromBytes'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1061: undefined reference to `MP4AV_Mp3GetChannels'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1062: undefined reference to `MP4AV_Mp3GetHdrSamplingRate'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1063: undefined reference to `MP4AV_Mp3GetHdrSamplingWindow'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1064: undefined reference to `MP4AV_Mp3GetBitRate'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1065: undefined reference to `MP4AV_Mp3GetHdrLayer'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1066: undefined reference to `MP4AV_Mp3GetHdrVersion'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1036: undefined reference to `MP4AV_Mpeg3ParseSeqHdr'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1075: undefined reference to `MP4AV_Ac3ParseHeader'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `find_pack_start':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:179: undefined reference to `MP4AV_Mpeg3FindNextStart'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_stream_find_mpeg_video_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:549: undefined reference to `MP4AV_Mpeg3FindNextStart'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:585: undefined reference to `MP4AV_Mpeg3FindNextStart'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_stream_find_h264_video_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:643: undefined reference to `h264_is_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:645: undefined reference to `h264_find_next_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:643: undefined reference to `h264_is_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:680: undefined reference to `h264_find_next_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:697: undefined reference to `h264_nal_unit_type'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:699: undefined reference to `h264_nal_unit_type_is_slice'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_stream_find_mp3_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:883: undefined reference to `MP4AV_Mp3GetNextFrame'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_stream_figure_out_video_type':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:735: undefined reference to `h264_is_start_code'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:736: undefined reference to `h264_nal_unit_type'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_stream_find_ac3_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:824: undefined reference to `MP4AV_Ac3ParseHeader'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_get_video_stream_name':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1575: undefined reference to `mpeg2_type'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_get_video_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1854: undefined reference to `MP4AV_Mpeg3PictHdrType'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_seek_video_frame':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:2118: undefined reference to `h264_access_unit_is_sync'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:2129: undefined reference to `MP4AV_Mpeg3PictHdrType'
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:2135: undefined reference to `MP4AV_Mpeg3PictHdrType'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_get_video_stream_name':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1571: undefined reference to `h264_get_profile_level_string'
./.libs/libmpeg2_program.a(mpeg2ps.o): In function `mpeg2ps_get_video_stream_mp4_type':
/tmp/mpeg4ip/lib/mpeg2ps/mpeg2ps.c:1633: undefined reference to `mpeg2_profile_to_mp4_track_type'
collect2: ld returned 1 exit status
make[3]: *** [mpeg_ps_info] エラー 1

これはライブラリのlibmp4av.soなどの読み込む順番が悪くて、関数が引けなくなっている。
lib/mpeg2ps/Makefileの286行目から始まる

prog_libadd = \
  $(top_builddir)/lib/gnu/libmpeg4ip_gnu.la \
  $(top_builddir)/lib/mp4av/libmp4av.la \
  $(top_builddir)/lib/mp4v2/libmp4v2.la \
  libmpeg2_program.la

prog_libadd = \
  libmpeg2_program.la \
  $(top_builddir)/lib/gnu/libmpeg4ip_gnu.la \
  $(top_builddir)/lib/mp4av/libmp4av.la \
  $(top_builddir)/lib/mp4v2/libmp4v2.la

にして、先にライブラリを読ませるようにする。再度、make。

今度は最後まで通る。

server/mp4creatorに出来ているはず。