上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top ▲
info@syakainoteihen.homedns.org

スパムメールを収集したいんです。
1週間から1ヶ月くらい。

業者さん、よろしゅう。
2009.07.16 Thu l 未分類 l COM(0) TB(0) l top ▲
またまた、FFmpegです。
ネタに困ったんじゃなくて、最近、Xvidのエンコードに変な音が乗っかるので、
Xvidとh264をアップデートする次いでに、FFmpegもアップデートしました。

まずは、H264

ソースをダウン

wget ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20090604-2245.tar.bz2

そして解凍

bzip2 -dc ./x264-snapshot-20090604-2245.tar.bz2 |tar xvf -

以前の手順では行っていませんでいたが、前もって
yasm-0.7.2
をインストールしています。
これが無いと、h264のエンコードに、死ねるほど時間がかかります。

ディレクトリに移動して、コンパイル


./configure --enable-shared

configureの結果がコレだよ

Platform: X86
System: LINUX
asm: yes
avis input: no
mp4 output: yes
pthread: yes
debug: no
gprof: no
PIC: no
shared: yes
visualize: no


あとは普通にmekemeke install

続いて、Xvid

wget http://downloads.xvid.org/downloads/xvidcore-1.2.2.tar.gz
tar zxvf xvidcore-1.2.2.tar.gz
mv xvidcore xvidcore-1.2.2
cd xvidcore-1.2.2/build/generic/
./configure
make
make install

ヴァージョン管理しやすいように、解凍ディレクトリには、ヴァージョンをつけています。

で、FFmpeg
現在のディレクトリは、タイムスタンプをつけてムーブします。
で、ダウンロード。

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

前回のコンパイル情報を元に、configure

./configure --enable-gpl --enable-shared \
--enable-libfaac --enable-libfaad --enable-libfaadbin \
--enable-libmp3lame --enable-pthreads --enable-liba52 \
--disable-zlib --enable-libx264 --enable-libvorbis \
--enable-pthreads --enable-libxvid \
--enable-zlib --enable-libopencore-amrnb \
--enable-libopencore-amrwb --list-decoders

すると


Unknown option "--enable-liba52".
See ./configure --help for available options.

コンパイルオプションから、liba52が消えていました。
他にも精査して、最終的なコンパイルオプションが

./configure --enable-gpl --enable-shared \
--enable-nonfree --enable-libfaac --enable-libfaad --enable-libfaadbin \
--enable-libmp3lame --enable-pthreads \
--enable-libx264 --enable-libvorbis \
--enable-pthreads --enable-libxvid \
--enable-version3 --enable-zlib \
--enable-libvorbis --enable-libamr-nb --enable-libamr-wb

configureの結果

libamr-nb support yes
libamr-wb support yes
libdc1394 support no
libdirac enabled no
libfaac enabled yes
libfaad enabled yes
libfaad dlopened yes
libgsm enabled no
libmp3lame enabled yes
libnut enabled no
libopencore-amrnb support no
libopencore-amrwb support no
libopenjpeg enabled no
libschroedinger enabled no
libspeex enabled no
libtheora enabled no
libvorbis enabled yes
libx264 enabled yes
libxvid enabled yes
zlib enabled yes
bzlib enabled yes

あとは

make && make install

適当にエンコして異常がなければOK

psp用にエンコ

ffmpeg -i RIP/mr_brain.mpg -vcodec libx264 -coder 1 \
-bufsize 128 -g 250 -s 480x272 -r 29.97 -b 250k \
-bt 250k -vlevel 21 -acodec libfaac -ac 2 -ar 44100 \
-ab 96k -f mp4 RIP/mr_brain001.mp4


問題は無いようです。
その他ライブラリのインストールは過去のログを参照してください。
【健忘録】ff-mpegインストール ・・・とりあえずインストール編
2009.06.08 Mon l 健忘録 l COM(0) TB(0) l top ▲
ちょっと訳あって、インストール環境のテストが欲しくなった。
余ってるサーバを勝手にやってもいいのだけれどそれだと何かと気を使うので、
家からThinkPadR30を持ってきた。

CPUはCerelon800MHz
メモリは128MB

昔、Pentium166MHzのマシンにTurbo7をインストールしていたので、
世代的にCentOS4.4で問題ないかと。

さっそく、CDでインストール。
HDDが20GBしかないので、パーティション考えるのが面倒なので
/boot 100MB
/tmp 512MB
/swap 1024MB
/ 残り全部
の漢割り。

目的はテストなので、インストールパッケージは開発のみ。
サクッと2時間程・・・

まあ、再起動まで問題なく、ちゃんと起動。

・chkconfigの調整(過去エントリ)
・SELinuxの無効化
vi /etc/selinux/config
-------------------------------
SELINUX=disabled
-------------------------------
・IPV6の無効化
vi /etc/modprobe.conf
-------------------------------
alias net-pf-10 off
alias ipv6 off
-------------------------------
更にupdateを行い、reboot

が、ここでIRQの割り込み違反と思われるエラーで起動しない。

Disabling IRQ #15・・・

起動オプションに
apci=off
と入れろと警告が出てる。
リセットし、起動時に e を押し、
起動オプションに、馬鹿正直に
apci=off
をつけて起動。

しかし、起動はするものの、起動までやたら時間が掛る。

で、irqpollを起動オプションに加えると良いっぽい。

起動のたんびに設定する訳にいかないので

vi /etc/grub.conf
---------------------------------
kernel /vmlinuz-2.6.9-78.0.22.EL ro root=LABEL=/ acpi=off irqpoll
---------------------------------
こんな感じで設定。
で、再起動。

うん、ちゃんと起動してくる。
2009.05.17 Sun l 健忘録 l COM(0) TB(0) l top ▲
最近、知りあいのニコニコ用のMHP2G実況プレイ動画のエンコードを、私の自宅サーバで行っている。
流れとしては

・自分で録画

・サーバにうp

・周囲の黒枠を取って、640x480のavi(xvid)にエンコード

・字幕などの編集作業

・再度、サーバでh264にエンコード

まあ、最初のはこんな感じ
(ffmpegのインストールに関しては過去ログ参照)

nikoniko_avi.sh


#!/bin/sh
/usr/local/bin/ffmpeg -i $1 -vcodec libxvid -b 2000kb/s -cropleft 104 -cropright 104 -croptop 48 -cropbottom 48 -s 640x480 -aspect 4:3 -async 1 -acodec libmp3lame -deinterlace -ac 2 -ar 48000 -ab 360kb/s -vol 80 $1_640x480.avi


使い方は
./nikoniko_avi.sh ファイル名

これで、黒枠を取った4:3の動画が出来上がる。

H264にエンコード

nikoniko_h264.sh


#!/bin/sh
/usr/local/bin/ffmpeg -i $1 -vcodec libx264 -b $2kb/s -s 512x384 -aspect 4:3 -async 1 -acodec libfaac -deinterlace -ac 2 -ar 44100 -ab 64kb/s $1_h264.mp4



使い方は
./nikoniko_h264.sh ファイル名 動画レート(数字) フレーム("-r XX" )

たとえば、hoge.aviを250kb/sで出力したければ

./nikoniko_h264.sh hoge.avi 250

フレームレートを10にしたければ

./nikoniko_h264.sh hoge.avi 250 "-r 10 "

こんな感じ。
これで、エコノミーならファイルサイズ40MB未満、プレミアムなら100MB未満でアップできます。
2009.05.10 Sun l 健忘録 l COM(0) TB(0) l top ▲
※5/10 スクリプトに間違いがありましたので修正しました

ドメインを取りたいと考え始めた。
現在、自宅鯖はDDNSx2で運用中。

ドメインを取って運用となれば当然ネームサーバが必要で、自分で目的別にサブドメイン切ったり、mxレコードなんかもアレしたい時に外部サービス(有料)にいちいち・・・しかも固定IPじゃないからね・・・。
で、手前でネームサーバを立て、IP更新時に自動的にzoneファイルのIP、シリアル値を更新するようにすれば良いじゃん!と思い立ったわけで。

BINDで動的更新の設定は出来るのですが、セキュア面での不安がありますのでひとまず。

まずはnamed.confの設定


//
// named.conf for Red Hat caching-nameserver
//

options {
version "";
directory "/var/named";
allow-query { localhost; };
allow-recursion { localhost; localnets; };
allow-transfer { localhost; localnets; };

listen-on {
127.0.0.1;
any;
};

};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

logging {
category lame-servers { null; };
};

view "internal"{
match-clients { localnets; };
recursion yes;

zone "." IN {
type hint;
file "named.ca";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa";
};

zone "1.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa";
};

zone "localhost" {
type master;
file "mst.localhost";
};

};

include "/var/named/named_zone.list";
include "/etc/rndc.key";


他にも設定条項はありますが見せられません。まあ、これでも動きますので。
ここではローカルの設定のみ。ほんちゃんはincludeしている named_zone.list

named_zone.list

view "external" {
match-clients { any; };
recursion no;

zone "XXXXXX.ddo.jp" {
type master;
file "XXXXXX.ddo.jp";
allow-query { any ;};
};

zone "XXXXXX.homeip.net" {
type master;
file "XXXXXX.homeip.net";
allow-query { any ;};
};


};

→ view "external" {
で外部からの問い合わせに対応。
ここでは実験的に二つのDDNSにふってあるzone情報を作成。
直接このサーバに問い合わせ、これらの名前解決及び、設定条項が適応していればok


で、zoneファイルのタネ
zoneファイルにorgなどソースファイルと分かる名前をつける。
XXXXXX.ddo.jp.org


$TTL 600
@ IN SOA XXXXXX.ddo.jp. root.XXXXXX.ddo.jp. (
SERIAL ;Serial
28800 ;Refresh
7200 ;Retry
604800 ;Expire
86400 ;Minimum
)
IN NS XXXXXX.ddo.jp.
IN MX 10 mail.XXXXXX.ddo.jp.
* IN A IP_ADD
@ IN A IP_ADD
mail IN A IP_ADD


zoneの更新を行う場合はこちらのファイルを更新する。
動的IPなんで本当はもうちょっとTTLを減らしたいが、今はこんなもんで。

で、キモとなるスクリプト。

IP監視&更新スクリプトを利用。

#!/bin/sh

# IPを確認

wget -O/root/IP/index.html http://checkip.dyndns.com/

# 取得したファイルがIP情報のものか判別。エラーなどの画面の場合終了。

FLAG1=`cat /root/IP/index.html|wc -l`

if [ $FLAG1 = 1 ];
then

# IPの切り出し

cat /root/IP/index.html |awk -F "IP Address: " '{print $2}'|awk -F\< '{print $1}' > /root/IP/index
IPDATE=`cat /root/IP/index`

# ここでも判定

NAKAMI=`cat /root/IP/index|grep -c [0-9]`

if [ $NAKAMI -ge 1 ];
then

# 前の状態のIPと比較。相違点があればIP更新、ログに記載

UPDATE=`diff /root/IP/index /root/IP/index.old |wc -l `

if [ $UPDATE -ge 1 ];
then
# IPの更新。登録しているDDNSによって変わります

wget -O- "http://UserID:Passwd@members.dyndns.org:80/nic/update?hostname=HOSTNAME.homeip.net"
wget -O- "http://free.ddo.jp/dnsupdate.php?dn=HOSTNAME.ddo.jp&pw=Passwd"

mv /root/IP/index /root/IP/index.old
echo "IP Update $UPDATE $IPDATE `date`" >> /var/log/update.log

# ここからzoneの更新

SERIAL=`date +%Y%m%d%H`

# ログにIPが正常に反映されているか確認、IPの切り出し

FLAG=`tail -n1 /var/log/update.log |grep "IP"|awk '{print $4}'|grep [0-9]|grep -v -i [a-z]|grep -v ":"|grep -c "."`
UPDATE_IP=`tail -n1 /var/log/update.log |grep "IP"|awk '{print $4}'`

if [ $FLAG = 1 ];
then

# named_zone.listがそのままリストになる

LIST=`cat /var/named/named_zone.list|grep zone|awk -F\" '{print $2}'`

# 現在のzoneファイルはシリアル値を与えられ保存、orgファイルをつかってzoneファイルを更新

for ZONELIST in $LIST
do
cp -a /var/named/$ZONELIST /var/named/data/$ZONELIST_$SERIAL
cat /var/named/data/$ZONELIST.org |sed -e "s/IP_ADD/$UPDATE_IP/g"|\
sed -e "s/SERIAL/$SERIAL/g" > /var/named/$ZONELIST
done

# confの記載判定。エラーがなければbind再起動。あればバックアップしたzoneファイルを書き戻し終了

FLAG_BIND=`named-checkconf |wc -l`

if [ $FLAG_BIND = 0 ];
then
/usr/sbin/rndc reload
else
for ZONELIST in $LIST
do
mv -f /var/named/data/$ZONELIST_$SERIAL /var/named/$ZONELIST
done
fi
fi

fi

fi

fi
exit

if文だらけで大変お見苦しいスクリプトです。
実際masterしかないネームサーバですが、まあ、いいかと。
ドメイン登録の時はDDNSに割り当てた2つのホスト名をネームサーバとして登録します。
DDNSと言う事で、どちらかのネームサーバが落ちたり、サービスが終了しても、対処に余裕が持てるようにです。

IPの更新をデーモンなどで行っているなら、IPの取得と判定、zoneファイルの更新だけ切り取ればいいかと。

さて、これでうまくいくかな・・・。
2009.03.22 Sun l 健忘録 l COM(0) TB(0) l top ▲