2026年8月12日水曜日

MediaMTXでAction 5 ProのHWエンコードを使ってみた。

 前にラズパイでuStreamerでUSBカメラのMJPEGエンコーダを使ってそのままストリーミングしたらめっちゃ低遅延だったんだけど、友人がDJI Osmo Action 5 Proを持ってるとのことだったので借りてきてH264バージョンを試してみることに。

まず初めにどのフォーマットに対応してるのか確認。ウェブカメラモードにしてラズパイゼロに繋いで、

v4l2-ctl -d /dev/video0 --list-formats-ext

をしてみると

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
        [1]: 'H264' (H.264, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)

まずは前回と同じ条件(720pのMJPEG)で測定してみた。

247msだった。C270だと160msぐらいだったのに。Action 5 ProのほうがC270より遅延がある。やはりここはUSBカメラのチップによるのかな。

お次はH264と思ったんだけどuStreamerが対応していないようなのでMediaMTXで試してみることに。

MediaMTXはラズパイカメラの遅延を試したときに使ったやつをそのまま使うことに。H264をそのまま入れてやるのにffmpegも必要だった。(copyなので変換はしていない)

mediamtx.ymlの下の方のpaths:を書き換える。

paths:
  cam0:
    runOnInit: ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0 -c:v copy -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH
    runOnInitRestart: yes

解像度は720pと1080pが対応してるのでそれに合わせて入れてやらないとだめっぽい。

とりあえず1080pで遅延測定。

遅延は312msほど。フルHDでこの遅延はなかなか良いのかも。ちなみにWebRTCを使ってブラウザから見てる。

次は720p

遅延は319msだった。フルHDとあんまり変わらないかも。ちなみに帯域は2Mbpsぐらい。動かないと1/4ぐらいになる。フルHDだと4Mbpsぐらい。

カメラがめっちゃ温かい。そして電源に繋いであるのにバッテリーが減っているのでラズパイと同じところから供給では電流が足りていない可能性。今回はUSB2.0ってのもあるかもしれないけど。

ラズパイカメラV1より画質が良くて低遅延なんだけども今のところの遅延最強はC270とuStreamerかなぁ。

2026年8月11日火曜日

MacBook Pro Late 2013をmacOS Sonomaにアップグレードしてみた。

 昔購入したMacBook Proを久しぶりに引っ張り出してきたらChromeとかドライバ類のサポートが終了していて困ったんだけど、OSもBigSurまでのサポートなのでどうしようもなくなってしまっていた。

調べてみるとOpenCore Legacy Patcherというソフトを使うとサポート終了したデバイスに新しいOSをインストールすることができるらしい。試しにやってみた。

必要なものは32GB以上のUSBメモリ。できればUSB3.0対応が良いらしい。microSDカードとカードリーダーで試してみたけどEFI bootで表示されなかったのでUSBメモリが良さそう。

ちなみにBootcampはBoot Campアシスタントから削除しておいた。

とりあえずBigSurまでアップデートされているのでOpenCore Legacy Patcherをダウンロードしてインストールする。OpenCore-Patcher.pkgをダウンロードして実行すればOK。

インストールが終わったら起動して、インストール用USBメモリを作成する。Create macOS Installerを選ぶ。

今回は少し古めのSonomaにしてみた。USBメモリの作成が終わるとOpenCoreをインストールするように言われるのでOpenCoreをMac本体のSSDにインストールする。

OpenCoreをインストールしたら作成したインストールUSBメモリを指したままOptionキーを押しながら再起動する。

EFI bootが追加されてるのでそちらからSonomaのインストーラーを選択して起動。インストール先をBigSurが入ってるパーティションを選んだのでアップグレードインストールが実行された。

あとは何回か再起動を繰り返すんだけど、特に何もせずに放置しておくと勝手にSonomaが立ち上がってきた。結構な時間がかかったような気がするけどこれは簡単かも。

とりあえずChromeもアップデートできるようになったし、動作もSonomaとBigSurだとさほど変わらない気がするのでまだ使えそう。



2026年8月1日土曜日

OpenWrt用のMACアドレス検索スクリプトを作ってみた。

 DD-WRTからOpenWrtに移行するにあたって、デバイスが多いと何がつながってるのか調べるのにMACアドレス検索を使っていたんだけど、DD-WRTではクリックするだけで見れていたのにOpenWrtのLuCIにはそういう機能がないのでJavaScriptで試してみた。

最初ブックマークレットを作ってみたんだけど、自動リフレッシュのタイミングでリンクが消えてしまうのでluci.jsに追記する形にしてみた。

(function(){function l(n){let w=document.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,!1),t,m=/\b([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})\b/g,r=[];while(t=w.nextNode())t.parentNode&&"SPAN"!==t.parentNode.tagName&&"A"!==t.parentNode.tagName&&"SCRIPT"!==t.parentNode.tagName&&"STYLE"!==t.parentNode.tagName&&m.test(t.nodeValue)&&r.push(t);r.forEach(e=>{let p=e.parentNode;if(!p)return;let h=e.nodeValue.replace(m,o=>{let oui=o.replace(/[:-]/g,"").substring(0,6).toLowerCase();let u=["https:","","uic.jp","mac","address",oui,""].join("/");return'<span data-mac-link="1" title="MAC Vender: '+o+'" style="color:#0066cc;text-decoration:underline;font-weight:bold;cursor:pointer;" onclick="window.open(\''+u+'\',\'_blank\',\'width=800,height=600,scrollbars=yes,resizable=yes\');">'+o+"</span>"});let s=document.createElement("span");s.innerHTML=h;while(s.firstChild)p.insertBefore(s.firstChild,e);p.removeChild(e)})}let v=new MutationObserver(n=>{n.forEach(w=>{w.addedNodes.forEach(t=>{1===t.nodeType&&!t.querySelector('[data-mac-link="1"]')&&l(t)})})});if("loading"===document.readyState)window.addEventListener("DOMContentLoaded",()=>{l(document.body);v.observe(document.body,{childList:!0,subtree:!0})});else{l(document.body);v.observe(document.body,{childList:!0,subtree:!0})}})();

この一行を/www/luci-static/resources/luci.jsの一番最後に追記するだけ。後は設定画面を開いてCtrl+F5を押してリロードするとあらゆるMACアドレス表示部分がリンクに変更されているはず。

これでhostnameが表示されないデバイスでも、デバイスのメーカーがわかりやすくなったのでデバイスが増えても安心。
MACアドレスをクリックするとこんな感じで検索サイトをそのまま小さいウインドウで出してくれる。DD-WRTの機能としては地味に便利だったのでこれでOpenWrtのLuCIも便利になったな。

2026年7月26日日曜日

OpenWrtでDNSブロックを設定してみた。

 OpenWrtでもDD-WRTで使用してたDNSブロックのスクリプトが使いたかったので設定してみた。Softwareからインストールしてもいいんだけど何を使えばいいのかわからなかったのでとりあえず。WRC-X3200GST3に設定してみた。

DD-WRTで使用していたスクリプトはjffsに入れておいてtmpにコピーしてcronで実行していたので、同じ用にStartupスクリプトに入れてtmpにコピーしてcronで動かすようにしてみた。まずはStartupの設定。

#adblock
cat <<'EOF' > /tmp/adblock.sh
#!/bin/sh
logger WAN up script executing
if test -s /tmp/hosts0
then
        rm /tmp/hosts0
fi

logger Downloading http://www.mvps.org/winhelp2002/hosts.txt
(wget -qO- https://winhelp2002.mvps.org/hosts.txt |
    sed '2,$s/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -qO- https://280blocker.net/files/280blocker_domain_$(date +"%Y%m").txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
#wget -qO- https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardDNS.txt |
#    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
#    grep -v localhost ;
#wget -qO- https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt | 
#          grep "^||" | grep -v "*" | sed 's/||/127.0.0.1 /g'| tr -d '^';
wget -qO- https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
#wget -qO- https://raw.githubusercontent.com/multiverse2011/adawaylist-jp/master/hosts |
#    sed 's/127.0.0.1/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
#    grep -v localhost ;
wget -qO- https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt |
    sed 's/^/127.0.0.1 /g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
wget -qO- https://warui.intaa.net/adhosts/hosts.txt |
    sed 's/0.0.0.0/127.0.0.1/g; s/[[:space:]]*#.*$//g;' |
    grep -v localhost ;
echo 127.0.0.1 v-img-ad.interactive-circle.jp ;
echo 127.0.0.1 extrk4.mira-dsp.com ;
echo 127.0.0.1 ve.adingo.jp ;
echo 127.0.0.1 cu-ad.tbs.co.jp;
echo 192.168.1.1 buffalo.setup;
echo 192.168.1.1 web.setting ) | tr ' ' '\t' |
    tr -s '\t' | tr -d '\015' | sed '/^$/d' | sort -u >/tmp/hosts0
sed '/vortex.data.microsoft.com/d' /tmp/hosts0 -i
sed '/imasdk.googleapis.com/d' /tmp/hosts0 -i
sed '/tags.tiqcdn.com/d' /tmp/hosts0 -i
/etc/init.d/dnsmasq restart
EOF

chmod +x /tmp/adblock.sh
/tmp/adblock.sh

WRC-X3200GST3の方はOSがそれ用じゃないのでLEDの設定とかあるけどそれと一緒にStartupに突っ込んでみた。DD-WRT用から変更したのはcurlからwgetにしたりとかdnsmascの設定とかかな。

お次はdnsmasqの設定とcronの設定をsshから。

uci add_list dhcp.@dnsmasq[0].addnhosts='/tmp/hosts0'
uci commit dhcp
echo "0 4 * * * /etc/adblock.sh" >> /etc/crontabs/root

これで後はルーターを再起動してやれば自動でtmpに作成されてAM4時にフィルタが更新されるようになるはず…

ちなみにWAN側のDNSはカスタム設定にしておいた。

2026年7月25日土曜日

かってにスイッチをつけてもらった。

 玄関の電気を自動でつくようにするために"かってにスイッチ"WTK1811WKをポチってみた。やはり今まであったのに無いとちょっと不便だったので…

熱線センサ付自動スイッチというもので、人間が通ると自動で電気がつくんだけどWTK1811WKとかWTK18115WKとかどっちを買えばよかったのかわからなかったんだけど、たまたまWTK1811Wが出品されてて買い逃がしてしまったら新型でLED対応のWTK1811WKが出ていたので即ポチってみた。

WTK1811WKとWTK18115WKの違いはブランクチップが付属しているかどうかの違いっぽい。なのでスイッチの配置によって選ぶ必要があるっぽいけどWTK1811WKのブランクチップを外せばWTK18115WKとして使える。

取り付けは電気工事士の資格が必要なので父にお願いしてつけてもらった。もともと3連が付いていたんだけど1個は4路スイッチであんまり使わないところのが来ていたのでバイパスしてもらって、かってにスイッチが2個分占有するのでちょうどよくつけられた。

かってにスイッチの蓋があいて時間と明るさセンサの感度を調整できるの知らなかった…

2026年7月19日日曜日

OpenWrtにTailscaleをインストールしてみた。

 E8450用のUBIバージョンのOpenWRTをインストールしたWRC-X3200GST3にTailscaleをインストールしてみた。容量がたくさんあるのでいろいろなアプリケーションがインストールできそう。

とりあえずコマンドプロンプトから
ssh root@192.168.1.1

でOpenWRTのSSHにログオンして

apk update
apk add tailscale

でインストールできる。今回使ってるOpenWRTのバージョンは25.12.5です。OpenWRT 25.12からapkコマンドになっているのね…
インストール後、Disk Spaceを11.82MBぐらい消費した。

tailscale up

でTailscaleを起動して、うまく起動するとURLが表示されるのでPCなどからアクセスしてTailscaleにログオンする。
デバイスがうまく登録できるとSuccessとでてログオン完了。

とりあえずこれでTailscaleのネットワークに接続されたんだけど、今回はExit nodeとして設定してみる。

apk add ethtool
ethtool -K lan1 rx-gro-list off ethtool -K lan1 rx-udp-gro-forwarding on
tailscale up --advertise-exit-node --netfilter-mode=off

これでTailscaleのコンソールからExitノードとして設定できるようになる。ethtoolの設定2行はCPU負荷を軽くするための設定のようなんだけど起動のたびに戻ってしまうようなのでこの2行はうまく行ったらStartupに入れておくと良い。ちなみにlan1なのはE8450化するとlan1がWANなので…WANにつながってるインターフェースを設定する感じ。

次にTailscaleのコンソールの設定とファイアーウォールの設定。Tailscaleのコンソールを開いて

openwrtのデバイスのEdit route settingsを開いて
Use as exit nodeにチェックを入れる。

次にOpenWRTの方に戻ってWebUIで設定してみた。

Network→Interfaceのところを開いてAddでtailscaleを追加。

とりあえずこの設定のあとに出てくる画面はデフォルトのままで保存した。これを作っておかないとファイアーウォールの設定が出来ないので…

次にNetwork→Firewallを開いて、Addで

こんな感じにWAN側にパケットを通せるようにして保存。
あとはSave & Applyをする。

これでiPhone側からTailscaleに接続してEXIT NODEをタップするとopenwrtが選べるようになってるはず。なぜか繋がらないときはifconfigをしてtailscale0のIPアドレスを確認してみると良いかも。ipv4のアドレスが存在してなくて再起動したらつながった…
とりあえず最後に再起動するとよいのかも。(Interfaceの設定を変更したりするとどうしてもEXIT NODEが繋がらなくなるんだけど再起動で治る)

前にDD-WRTでWireGuard設定したときよりも簡単かもしれない。これで海外に行ったときも安心だな。

LAN内のデバイスに接続できるようにするのは後日やってみようっと。

2026年7月12日日曜日

WRC-X3200GST3にE8450用OpenWRTを入れて復活。

 電源が入らないというジャンクで出品されていたWRC-X3200GST3だけども、とりあえずRAMで起動して問題ないことがわかったし、Flashも実は問題なさそうだったのでどうにかFlashから起動できるように改造してみた。

といってもFlashの中身が飛んだ状態で売られていたジャンク品なのでPreloaderやubootのバックアップはないし…

ということで他の機種のデータを使えないか試してみた。MT7622搭載デバイスのデータで色々試してみたんだけど、他の機種だと1ddrとかの制約があったのでE8450化してうまくフラッシュから起動することができるようになった。

Linksys E8450のリカバリ方法をそのまま実行すればUBIバージョンのLinksys E8450になることがわかった。

実行したのはLinksys E8450のリカバリのRecovery instructions - Reload OpenWRT 24.10 from scratchのところ。

WRC-X3200GST3の方はmtk_uartbootでE8450のデータでブートするところまでやって、Ctrl+Cで

MT7622> <INTERRUPT>
MT7622> 

のところまでやっておく。あとTFTPでデータを転送するために

setenv ethaddr 00:11:22:33:44:55
setenv eth1addr 00:11:22:33:44:56
setenv serverip 192.168.1.254
setenv ipaddr 192.168.1.1

まで設定を済ませておく。これで本体側の準備はOK

PC側もファイルをダウンロードしてファイル名を変更しておく。
openwrt-mediatek-mt7622-linksys_e8450-ubi-preloader.bin
openwrt-mediatek-mt7622-linksys_e8450-ubi-bl31-uboot.fip
openwrt-mediatek-mt7622-linksys_e8450-ubi-initramfs-recovery.itb
factory.bin

これらのファイルをダウンロードしておく。ダウンロードしたファイル名とリンクのファイル名が違うので、リンクのファイル名に直しておく。

ファイル名を上のリンクどおりに揃えたらTFTPサーバの直下に置いておく。

ubi detach; mtd erase ubi && ubi part ubi
mw $loadaddr 0xff 0x1f000
run boot_tftp_write_bl2
run boot_tftp_write_fip
tftpboot 0x48000000 factory.bin

ここでRAM上に読み込んでいるfactory.binにMACアドレスを書き込む。もしかしたらfactory.binを編集してからTFTPで流し込んでもいいのかも。順番はWAN、LAN、2.4GHz、5GHzなんだけどラベルに貼ってあったMACアドレスがWANらしいのでそれを基準に入れてみた。ラベルのSSIDはWAN-1の値だったのでそこから推測。これをやっておかないとMACアドレスがランダムになってしまう。

mw.b 0x4807FFFA 0x04
mw.b 0x4807FFFB 0xab
mw.b 0x4807FFFC 0x18
mw.b 0x4807FFFD 0xc0
mw.b 0x4807FFFE 0x7c
mw.b 0x4807FFFF 0x24

mw.b 0x4807FFF4 0x04
mw.b 0x4807FFF5 0xab
mw.b 0x4807FFF6 0x18
mw.b 0x4807FFF7 0xc0
mw.b 0x4807FFF8 0x7c
mw.b 0x4807FFF9 0x25

mw.b 0x48000004 0x04
mw.b 0x48000005 0xab
mw.b 0x48000006 0x18
mw.b 0x48000007 0xc0
mw.b 0x48000008 0x7c
mw.b 0x48000009 0x23

mw.b 0x48005004 0x04
mw.b 0x48005005 0xab
mw.b 0x48005006 0x18
mw.b 0x48005007 0xc0
mw.b 0x48005008 0x7c
mw.b 0x48005009 0x22

MACアドレスを書き込んだら念のため呼び出してみる。

md.b 0x4807FFFA 6
md.b 0x4807FFF4 6
md.b 0x48000004 6
md.b 0x48005004 6

うまく書き込めていたらリカバリモードで起動する。

ubi create factory $filesize static && ubi write $loadaddr factory $filesize
run boot_tftp_recovery

これでOpenWRTがリカバリモードで起動するはず。E8450とWRC-X3200GST3のLANポートの割り当てが少し違うので注意。WRC-X3200GST3のWANはE8450でいうLAN1で、WRC-X3200GST3のLAN1はE8450でいうWANになっている。なのでPCをつなぐときはWRC-X3200GST3のLAN2~4かWANに繋いでおかないと繋がらない。とりあえずPCをLAN4に繋いで192.168.1.1に接続。SystemのBack up/Flash Firmwareからopenwrt-25.12.5-mediatek-mt7622-linksys_e8450-ubi-squashfs-sysupgrade.itbにアップデートして完了。

これでSPI Flashにうまく書き込まれてるようで普通に起動するようになった。E8450として起動するのでPower LEDがついていない。2.4GHzのLEDは点灯している。

cat /sys/class/gpio/gpiochip*/base | head -n1

が512だったのでPower LED(緑)がGPIO 49ということなので

echo "561" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio561/direction
echo "1" > /sys/class/gpio/gpio561/value

でPowerを緑色で点灯することが出来た。スタートアップスクリプトにでも入れておこう。

#Power Green
echo "561" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio561/direction
echo "1" > /sys/class/gpio/gpio561/value

#2.4GHz LED
echo "597" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio597/direction
echo "1" > /sys/class/gpio/gpio597/value

#5GHz LED
echo "601" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio601/direction
echo "1" > /sys/class/gpio/gpio601/value

これで起動するとそれなりにLEDが光る。ちなみにResetとWPSボタンのGPIOは同じなのでそのまま動くはず。

とりあえずLAN1をWANに設定して、WANをbr-lanに含める設定をしてみた。

MT7915もちゃんと認識してるし、スキャンも出来てるので使えそう。

シリアルコンソールで見てたらubootの方のMACアドレスが飛んでるのでシリアルコンソールからubootに入ってMACアドレスを設定してみる。カウントダウンが始まったあたりでCtrl+Cを押して、MT7622>ってなったら

setenv -f ethaddr 04:ab:18:c0:7c:24
saveenv

のようにスタンドに書いてあったMACアドレスを入力して保存してみた。これでブートローダー起動時のNo MAC Addressは消えた。

とりあえず文鎮化していたジャンクなWRC-X3200GST3をE8450として蘇らせることが出来たっぽい。LEDの設定とかちゃんとすればそこそこ使えるんじゃないかな。

あとおそらく前オーナが文鎮化させてしまった原因の可能性であるoverlay領域の少なさもE8450化で解決しているような。WRC-X3200GST3のOpenWRTだと8MBぐらいしか無いDisk SpaceもE8450化したことによって86.91MBもあるし。大きなモジュールもインストールできちゃう。

MACアドレスもfactory.bin転送後にラベルと合わせたのでちゃんと認識されている。

とりあえずだいぶ安くゲット出来たジャンク品が普通に使えるようになったので何より。いまのところ問題が出ていないけどGPIOがどこにつながってるかわからないので問題が起きても自己責任で。

1000円未満のジャンクにしてはだいぶ遊べたし勉強になった。12V 1.5AのACアダプタのほうが高い…