Showing posts sorted by relevance for query perlrtmp. Sort by date Show all posts
Showing posts sorted by relevance for query perlrtmp. Sort by date Show all posts

Friday, August 28, 2009

ぱぱネット(仮)さんのperlrtmp改造

perlrtmpに複数から使用していて、一方が無線LANで通信が滞りがちになると、他方の接続にも影響する。
なので、perlrtmpをinetd対応に改造しようかと思っていたところ、ぱぱネット(仮)様が、接続ごとに子プロセスに分ける改造をされていたので、いただいた。多謝。
その他にもいろいろ改造されたようだが、とりあえず子プロセスの部分だけ頂くことに。必要なのはperlrtmp.pl のみ。これを少々書き換えてserver.plとして使用すると、一方の接続の停滞に影響されないようになったようだ。いまのところゾンビも発生せずうまくいっている。多分接続数増加への耐性も上がっているだろう。

--- perlrtmp.pl 2009-07-25 09:51:05.000000000 +0900
+++ server.pl 2009-08-28 23:46:31.000000000 +0900
@@ -8,15 +8,14 @@
use POSIX ":sys_wait_h";

my $dir = $ARGV[0];
-my $port = $ARGV[1];
-my $dbn = $ARGV[2];

-if ($dir eq '' || $port eq '') {
- die "Usage: $0 <document> <server> <session>\n";
+if ($dir eq '') {
+ die "Usage: $0 <document>\n";
} else {
$dir =~ s/\/$//;
}

+my $port = '1935';
my $lsn = new IO::Socket::INET(Listen => 1, LocalPort => $port, Reuse => 1) or die;
my $sel = new IO::Select($lsn);

@@ -31,7 +30,7 @@
warn "[socket] connect from ", $new->peerhost, "\n";
$pidtable{$pid} = 1;
} elsif (defined $pid) {
- my $rtmp = RTMP->new($new, $dir, $dbn);
+ my $rtmp = RTMP->new($new, $dir);
my $cosel = new IO::Select($new);

while (1) {

Monday, August 10, 2009

perlrtmpバージョンアップとBonDriver対応ワンセグチューナー

  1. perlrtmpがflashplayer10のバージョンアップに伴いバージョンアップしたようです。入れ替えるだけでOK. なんらかの都合でlib/segwrapper.pmを使用している人はコピーしておくことを忘れずに。
  2. BonDriver対応のワンセグチューナーをたまたま持っていたのでWindowsでts.pl,rec.plを使って「ワンセグ野郎形式」ファイルをつくってみた。オリジナルよりサイズがちょっと大きくなるけどperlrtmpで使用できた(BonDriverが何かを加えているらしい)。 Windowsではパイプの処理をCMD.EXEが担当するようで、ts.plからbonDriverを使ってtsを吐くプログラムを動かすとDOS窓がチューナー分開いたままになるのが不細工。CMD.EXE互換で窓を開かないプログラムはないものか。

Monday, February 2, 2009

24時間ワンセグ野郎引越

いままでWindowsで動かしていた24時間ワンセグ野郎を自宅サーバーのマザーボード交換に伴いCPUパワーもアップしたことからFreeBSDへ引っ越した。
チューナーもLOG-J100からDUS-01へ変更。
UGEN経由のプログラムをここにあるとおりに書いてみた。SIGTERMとかの処理はさぼっているが(録画用perlプログラムからSIGTERMがやってくる)、一応動くようなのでOKということで。ただ、USB2.0ハブを通すと動かないのでK師匠に相談したところ、FreeBSD StableのEHCIドライバではUSB1.1のアイソクロナス転送がまだサポートされてないとのこと。引き出しの奥からひっぱり出してきたUSB1.1ハブにUSB2.0を2つ繋ぎ、そこにチューナーを8つ繋ぐことになった。
録画プログラムはOneSeg24 for Linux
を使用。dvbstreamのかわりに自作プログラムを使うので、オプション -c (num) で/dev/ugen(num) を使用するように、また -f で周波数設定 -o は無視してデフォルトで標準出力にTSを吐き出すようにした。
再生はperlrtmp(これもFreeBSD側に引越)とOneSeg24 for Linux付属のepg.cgi+player.cgiまたはplayer.pl差し替え版を使用、mp4変換や再エンコード機能は殺しているが今のところ必要なし。
今回はアンテナを分配器から鰐口クリップで接続したので、安定して録画できている。いやあ便利。
プログラムの作者のみなさんに感謝。
# その後1ヶ月分のTSファイルをWindowsからSAMBA経由でコピーするのに2日。

---
dus-01用手抜きプログラムFreeBSD版、ご自由にお使いいただいてかまいませんが、ご自分の責任で。
---

#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <dev/usb/usb.h>

#define TS_PACKET_SIZE 188
#define CMD_LEN 10
#define RET_MAX 3

char *ugenNum = "0";
int EP0,EP1,EP3;

unsigned char channelCmd[]={ 0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char chkRecCmd[] ={ 0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char mpgOnCmd[] ={ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
unsigned char mpgOffCmd[] ={ 0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

int chkVnd()
{
struct usb_device_info udi;

if(ioctl(EP0,USB_GET_DEVICEINFO,&udi)<0){
perror("chkVnd");
return 0;
}
if(udi.udi_vendorNo != 0x1bc8 || udi.udi_productNo != 0x0001)
return 0;
return 1;
}

void wrCmd(unsigned char *cmdArr)
{
if(-1==write(EP1,cmdArr,CMD_LEN)){
perror("wrCmd");
}
}

void rdRet(unsigned char *retArr)
{
if(-1==read(EP1,retArr,RET_MAX)){
perror("rdRet");
}
}

int setCH(int freq)
{
int i;
unsigned char retArr[RET_MAX];

wrCmd(mpgOffCmd);
channelCmd[3] = (freq >> 16) & 0xFF;
channelCmd[4] = (freq >> 8) & 0xFF;
channelCmd[5] = freq & 0xFF;
wrCmd(channelCmd);
usleep(500000);
for(i=0;i<10;i++){
wrCmd(chkRecCmd);
rdRet(retArr);
if(retArr[0]){
wrCmd(mpgOnCmd);
return 1;
}
usleep(100000);
}
return 0;
}

int getTS(unsigned char *pdata)
{
int i;

if(TS_PACKET_SIZE > read(EP3, pdata, TS_PACKET_SIZE))
return 0;
for (i = 1; i < TS_PACKET_SIZE; i++)
pdata[i] ^= 0xb5;
return 1;
}

int main(int argc, char *argv[])
{

char devName[PATH_MAX],EPname[PATH_MAX];
unsigned char TsPkt[TS_PACKET_SIZE];
int opt;
int freq= 545143;
int i=1;

while((opt=getopt(argc, argv,"f:c:o"))!=-1){
switch(opt){
case 'o':break;
case 'c':
ugenNum=optarg;
break;
case 'f':
freq=atoi(optarg);
break;
default:break;
}
}
sprintf(devName,"/dev/ugen%s",ugenNum);
if(-1==(EP0=open(devName, O_RDWR))){
perror("open EP0");
exit(-1);
}

if(!chkVnd()){
fprintf(stderr,"this is not dus01\n");
exit(-1);
}

sprintf(EPname,"%s.1",devName);
if(-1==(EP1=open(EPname,O_RDWR))){
perror("open EP1");
exit(-1);
}

sprintf(EPname,"%s.3",devName);
if(-1==(EP3=open(EPname,O_RDONLY))){
perror("open EP3");
exit(-1);
}

ioctl(EP1,USB_SET_SHORT_XFER,&i);
if(!setCH(freq)){
fprintf(stderr,"No Signal\n");
exit(-1);
}

while(getTS(TsPkt))
write(STDOUT_FILENO,TsPkt,TS_PACKET_SIZE);
wrCmd(mpgOffCmd);
return 1;
}

Thursday, April 2, 2009

OneSeg_Extract簡易版

player.pl差し替え版でmpeg4ファイルを作成する場合、Oneseg_Extract.exe、TSConverter.exeを呼び出す。Wineで動かしたいところだが、どちらもウインドウを開こうとするためhttpサーバから起動するのは色々厄介。TSConverterは内部からDtsEdit.exeとMP4Box.exeを起動するのだが、これらはウインドウを開かないのでWineから動かすことができる。
なので、Oneseg_Extract.exeとTSConverter.exeさえ移植すれば何とかなるわけだが、MP4Boxはportsからインストールできるし、DtsEditの最新版のソースをseraphy@管理人様に公開していただいたので、いい加減ながら移植した。
今回はとりあえずOneseg_Extractほぼ互換perlスクリプトだけ。
segwrapper.pmを使用したので簡単。最初の方の時刻関係は無くてもいいかも。
-- Oneseg_Extract.pl --
#!/usr/bin/perl
#
use Time::Local;
#
# path to "segwrapper.pm"
use lib '/usr/local/perlrtmp/lib';
use segwrapper;
#
my $outputfile=$ARGV[$#ARGV];
if($outputfile=~/(\d{6}-\d{6}-\d{6}-\d\d)\.ts$/){
  my $inputfile=$1;
  $outputfile=~/(\d{2})(\d{2})(\d{2})-\d{6}-(\d{2})(\d{2})(\d{2})-\d\d\.ts$/;
  if(time>timelocal($6,$5,$4,$3,$2-1,$1+2000)){
    my $opt = O_RDONLY | O_BINARY;
    eval { $opt |= O_LARGEFILE; };
    open(OUT,"> $outputfile") or die("can not open $outputfile for write");
    binmode(OUT);
    segwrapper::segopen(my $handle, $inputfile, $opt);
    my $packet_size = 4096;
    while(segwrapper::segread($handle, my $buf, $packet_size)) { print OUT $buf; }
    segwrapper::segclose($handle);
    exit;
  }
}
print "no record\n";
exit(-1);
残りはまた今度。

Tuesday, March 2, 2010

rec.pl フルセグストリーム対応(多分)

recBone.exe をフルセグチューナーで使ってみた人がいたらしい。
フルセグストリームでも perlrtmp は pid 0x1FC8 の PMT からストリームの PID を探してきてビデオとオーディオを送信してくれそうなものだが、多分 IDX ファイルのポインタの方が long 型を超えてしまうので、正しく動作しないようだ。
そんな人のために OneSeg24forLinux 付属の rec.pl を改造してフルセグストリームからワンセグ関連のみ抽出して IDX ファイルと共に保存するパッチを作ってみた。
ついでに、来るべきフルセグ野郎時代のために、フルセグ野郎 IDX 形式勝手に暫定版対応を行った。
IDX ファイルはポインタのビット数を増やすか、TS ファイルを1時間より短くして、IDX はそのままなど、やりかたはいろいろ考えられるが、勝手に暫定版ではファイルポインタではなく、パケット数を記録して、ビット数を増やさず、 TS も1時間のまま。188倍すればオリジナル IDX と同様に使用可能とした。
使用方法は rec.pl と同様。デフォルトでワンセグ野郎形式で保存 -f オプションでフルセグ野郎形式も同時に記録するという改造を行った。当然ながらフルセグ野郎形式対応ソフトは存在しない。
recFS.patch
ただ残念ながら、現在フルセグストリームを取り出す環境がないので...
recBoneFS.exe はまたの機会に。ってどっちも需要ないか。