2009/04/19

ffmpegのインストール(メモ)

動画録画サーバーに入れてあるffmpegを最新版にしました。
iPhone用の動画を作る際に最新版だと-f ipodを渡すだけでできるとのことだったので、アップデートしました。

そのときの方法をメモ的ですがのせておきます。
ソースから導入するので、現状の環境を汚さないように/usr/local/ffmpeg以下にすべてが導入されるようにしました。

まず、faacとfaadのインストール。
$ wget http://jaist.dl.sourceforge.net/sourceforge/faac/faac-1.28.tar.gz
$ tar xzvf faac-1.28
$ ./bootstrap
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


$ wget http://jaist.dl.sourceforge.net/sourceforge/faac/faad2-2.7.tar.gz
$ cd faad2-2.7
$ chmod 755 bootstrap
$ ./bootstrap
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


次に、x264で使用するyasmのインストール。
前まではrpmforgeのやつを使ってたんですが、ソースから簡単に導入できたので入れました。
$ wget http://www.tortall.net/projects/yasm/releases/yasm-0.7.2.tar.gz
$ tar xzvf yasm-0.7.2.tar.gz
$ cd yasm-0.7.2
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


次に、x264のインストール。
$ wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20090412-2245.tar.bz2
$ tar xjvf x264-snapshot-20090412-2245.tar.bz2
$ cd x264-snapshot-20090412-2245
$ export PATH=/usr/local/ffmpeg/bin:$PATH
$ ./configure --prefix=/usr/local/ffmpeg
$ make
$ make install


最後にffmpegのインストール。
$ svn co svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
$ cd ffmpeg
$ ./configure --enable-libx264 --enable-libfaad --enable-libfaac --enable-pthreads --extra-ldflags="-L/usr/local/ffmpeg/lib" --extra-cflags="-I/usr/local/ffmpeg/include" --enable-gpl --prefix=/usr/local/ffmpeg
$ make
$ make install


これでひとまず完了です。
iPhone用にしか考えていないので、対応コーデックは最低限にしました。

2009/04/13

XSからlibcのputs関数を呼び出す

前回はCのコードをxsコードに書いて、それを実行するということをやりました。
今回は外部のCライブラリを呼び出してみたいと思います。
一番簡単そうな例として、libcのputs関数を呼び出してみます。

まずはXSライブラリのひな形を作成します。
$ h2xs -A -n libcXS
perl Makefile.PL


次にXSソース(libcXS.xs)を編集します。
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "stdlib.h"

MODULE = libcXS PACKAGE = libcXS

void
puts(value)
char * value

追記したのは、include部にstdlib.hを追加したのと前回も追加した関数の戻り値などの定義部分です。
前回のようCODEセクションを定義してコードを書かなくても、既存のライブラリ呼び出しの場合は定義だけでOKです。

最後にmakeして完了です。

実際にこのモジュールを使ったPerlコードを使った例が次のものです。
標準出力にhogehogeと表示されるはずです。
#!/usr/bin/perl

use strict;
use ExtUtils::testlib;
use libcXS;

libcXS::puts("hogehoge");


だんだんわかってきたような気がしてきていますが、きちんと理解するためにはもう少し時間がかかりそうです。
ひとまず、perldoc perlxsとモダンPerl入門を改めて読んでみます。

----
追記:
なぜか、#include "stdlib.h"を消しても動きます…
前段階でincludeされてるのかなぁ、それとも別の原因…?
今度は違うライブラリでやってみたいと思います。

2009/04/11

インストールマニアックス2009に応募

http://www.thinkit.co.jp/maniax/2009/

インストールマニアックス2009に応募しました。
サーバー1台とWindows Web Server 2008を無償提供してもらえ、それに期間中にどれだけたくさんのOSSをインストールできるか競うというイベントです。

前回のには参加しそびれてしまったので、今回は応募できました。
当たれば今月末にでも機材が届くのかもしれないです。

機材を無償提供してもらえるのはうれしいですが、1年間動かし続けなきゃいけないのがちょっと痛いですが…電気代的な意味で。

2009/04/08

Pythonでテキストベースのインターフェイスを作成する

今日、よくLinuxのテキストモードインストール時に使用するインターフェイスの自作しているのを見て自分でもやりたくなってきたのでちょっと調べてみました。
何に使うかと言われると…ちょっと?ですが。

よく見るテキストモードでのインストールにはnewtというライブラリで実現できているのですが、そのnewtをPythonから使えるようにしたのがSnackというライブラリです。
setupコマンドでも利用されている、アレです。

CentOSでは何もインストールせずともSnackが含まれていたのですが、ubuntu(MIE)には含まれていなかったのでインストールしました。
ちなみにパッケージ名はpython-newtです。

使い方は下記のサイトにまとまっているのですが、全部理解するには少し時間がかかりそうです。
http://www.wanware.com/tsgdocs/snack.html

ひとまず、0.1秒に1%増えるプログレスバーだけ作ってみました。

#!/usr/bin/env python

import snack
import time

screen = snack.SnackScreen()

g = snack.GridForm(screen, 'TEST', 1, 1)

scale = snack.Scale(50, 100)
scale.set(0)
g.add(scale, 0, 0)

g.draw()

count = 0
while 1:
count = count + 1
scale.set(count)
g.draw()
screen.refresh()
time.sleep(0.1)
if count == 100:
break

screen.finish()


まだGrid、Formあたりの概念が理解しきれていないので引き続きドキュメントを読んでみます。
英語が苦手だとこんなところで障害になるんですよね…orz

あと、意外とGoogle Code Searchが参考になりました。
lang:python "import snack"とかで調べると使われてるコードがたくさん出てきて参考になります。

2009/04/07

Blogger Syntax Hilighterを導入

いつも記事でソースコードを書くときに毎回divとpreで囲んでごにょごにょしてたんだが、下記ページを参考にBlogger SYntax Hilighterを入れてみた。
http://www.kuribo.info/2009/02/blogger-syntax-highlighter-perl.html

最初Perlに対応していなくてどうしようかと思ったけど、どうにかなりました。

ひとまず、さっきの記事に適用してみました。
<とか>はきちんとエスケープしないとダメなようです。
ためしにいろいろ書いてみよう。


public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}



#include <stdio.h>

main() {
printf("Hello World!!\n");
}



#!/usr/bin/env python

def hello():
print "Hello World!"

hello()

XSを使ってみる

PerlからC APIを呼ぶ仕組みでXSというものがあります。
これにより、Cで書いた部分の処理に関しては高速になったり、既存のCで書かれたライブラリが使用できるようになるらしいです。
ちょっとおもしろそうなので、練習に動かしてみました。

モダンPerl入門に詳しく書いてあったのですが、ちょっとやることが多すぎたので下記のサイトの例をやってみました。
http://d.hatena.ne.jp/higepon/20050615/1118829090

手順は上記のサイトに書いてある通りに行いました。
$ h2xs -A -n MyTestXS ←XSのひな形を作成
$ cd MyTestXS/
$ perl Makefile.PL ← Makefileを作成
[MyTestXS.xsを編集]
$ make


MyTestXS.xsは次のように編集しました。
ちなみにMODULE = MyTestXSまでは自動的に作成されてました。
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"


MODULE = MyTestXS PACKAGE = MyTestXS

int
increment2(value)
int value
CODE:
RETVAL = value + 2;
OUTPUT:
RETVAL

追記した部分は、まず戻り値の型、関数名、引数名と型を指定します。
CODEより後ろには実際のCのコードを記述します。
OUTPUTに戻り値を指定します。

makeして失敗がなければ、XSモジュール作成完了です。
では、実際に使ってみつつ、ベンチマークもやってみました。
下記のようなコードを書きました。これも参考サイトと同じです。
#!/usr/bin/perl
use strict;

use ExtUtils::testlib;
use MyTestXS;

use Benchmark;

my $count = 5000000;
timethese($count,
{
'XS' => 'xs_test();',
'Perl' => 'perl_test();',
});

sub xs_test {
MyTestXS::increment2(100);
}

sub perl_test {
increment2(100);
}

sub increment2 {
$_[0] + 2;
}

これを実際に私のMacBookで実行してみると下記のような結果になりました。
macbook:MyTestXS hiroki$ perl ./test.pl 
Benchmark: timing 5000000 iterations of Perl, XS...
Perl: 5 wallclock secs ( 5.95 usr + 0.08 sys = 6.03 CPU) @ 829187.40/s (n=5000000)
XS: 3 wallclock secs ( 3.46 usr + 0.04 sys = 3.50 CPU) @ 1428571.43/s (n=5000000)

XSで書いた方が2倍近くパフォーマンスが良いです。

私としては、はやく動かすというよりも既存のCライブラリをPerlから使いたいと思ってるので、引き続き調べます。
モダンPerl入門を見ると詳細に書いてあるようで。