AndroidのオーディオをPCに転送して視聴ということをよくやるのですが,昔は3.5mmオーディオミニジャックで最近はBluetooth A2DP sourceで転送しています.
今回USBで転送できる sndcpy
を試してみました.
タグ: Android
snap版scrcpyでAndroidデバイス画面をビデオデバイスに出力
Androidアプリの画面をsnap版のscrcpyでビデオデバイスに流し込もうとしたら少しハマったのでメモしておきます.
scrcpyを使ってAndroidスマートフォンの動画をPCで視聴する
今日最終回でしたが,マンガUp!というアプリで他のsiteより12時間早く配信されているのに気づきました.でもモバイルアプリでないと視聴できません.手元ではスマートフォンしか無いので画面が小さい.
そういえば以前試したscrcpyだと画面キャプチャ禁止のアプリでも大丈夫だったのでこれでPCに画面転送してそちらで視聴すればいつもの画面で視聴できるのではと試してみました.
Note |
音声についてはscrcpyのaudioブランチを自分でbuildして --forward-audio オプションを利用することで転送できそう ですが私は未確認で現在はBluetooth A2DP-source でPCに転送しています.3.5mm Audio cableなどでも良さそうです. |
povo 2.0のSIMがmotorola moto g31で通信できない
先日,goo Simseller のOCNモバイルoneへのMVNOで1円で入手したmotorola moto g31ですが,povo 2.0のSIMをさして設定しても通信が出来ません.
ステータスはこんな感じで x マークが付いています.
PCでAndroid端末の画面転送と操作が出来るscrcpy
Debian sid amd64環境ではパッケージがあるので簡単です,armhf/amd64/i386環境ではsnap版が存在します.その他幾つかのLinuxディストリビューションではパッケージがあったり,WindowsやmacOSでも動作するようです.
手元ではDebian sid amd64で動作しました.(Raspberry Pi OS armhfにsnap版を入れた環境ではエラーが発生.内容は未だ未確認)
Debian sid amd64環境だと以下のような感じで導入できました.このときAndroid端末は「開発者向けオプション」が有効になっていて,「USBデバッグ」が有効になっている状態でUSB接続されている必要があります.
$ sudo apt install adb scrcpy (1) $ lsusb (2) : Bus 002 Device 013: ID 05c6:9024 Qualcomm, Inc. SDM439-MTP _SN:472BF8D8 : $ echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="05c6" ATTR{idProduct}=="9024", MODE="0660", GROUP="plugdev", SYMLINK+="android%n"' \ | sudo tee -a /etc/udev/rules.d/51-android.rules (3) $ sudo udevadm control --reload (4) $ adb devices (5) * daemon not running; starting now at tcp:5037 * daemon started successfully List of devices attached 976d6a56 device
- 必要パッケージの導入
- AndroidのVID/PIDを確認(ここでは
05c6:9024
) - adbコマンドが利用できるようにAndroid端末をudev roureに登録
- udev ruleを反映する
- adbコマンドで認識出来るのを確認
この状態で,scrcpy
を実行することでAndroidの画面転送が出来ました.普通に操作も出来ます.
スリープ状態のときは画面が真っ黒ですが,マウス右クリックで解除されます.
$ scrcpy INFO: scrcpy 1.14 <https://github.com/Genymobile/scrcpy> /usr/share/scrcpy/s...93 bytes in 0.008s) [server] INFO: Device: TINNO C330 (Android 9) INFO: OpenGL shaders: ENABLED INFO: Created renderer: opengl INFO: Renderer: opengl INFO: OpenGL version: 3.0 Mesa 20.2.4 INFO: Trilinear filtering enabled INFO: Initial texture: 720x1280
導入も簡単だしこれは便利.しかしメイン端末ではPCにUSB接続するとすぐに充電しなくなってしまうので長時間は使えません.
adb
のワイヤレス接続の設定をすると別の端末や充電器で充電しながら利用できそうなので試してみました.
対象のAndroid端末をPCにUSB接続した状態で tcpip
コマンドでリモート接続できるようにします.
$ adb tcpip 5555 restarting in TCP mode port: 5555
この状態でPCからAndroid端末を取り外し,Wi-Fi接続のIPアドレスを確認します.
PCでadbコマンドでAndroid端末に接続します.
$ adb connect <ANDROID_IP>>:5555
この状態で scrcpy
コマンドを実行すると画面が表示され操作できます.充電器などに接続した状態でも利用できます :)
scrcpy
には幾つかオプションがあります.便利そうなものとしては最大解像度を指定する -m, --max-size value
で解像度を下げて表示できます,
-n, --no-control
で表示だけで操作できなくします.
-r, --record file
で画面を録画します.
-w, --stay-awake
でscrcpyを実行中Android画面をロック,消灯しません.
-S, --turn-screen-off
Android端末のスクリーンを消したまま操作できます.
ショートカットでは
Ctrl + h
, マウス中キー
でホームボタン,
Ctrl + r
でAndroid画面回転,
Ctrl + s
でアプリケーション切り替え,
辺りが便利そうです,
Ctrl + c
でクリップボードのコピーなのですが,一旦Android側でコピーした後に Ctrl + c
でPCへのクリップボードコピーのようです,Ctrl + v
の貼り付けもAndroid感での貼り付けで,PCからAndroidのクリップボード貼り付けは Ctrl + Shift + v
でした.
詳細は scrcpy --help
を参照してください.
これでElectronアプリでPCで動かしているアプリをスマホで……とも思ったのですが日本語入力などはちょっと面倒.もう少し様子見しようと思います.
termux-APIのTermux-usbを少し試す
Androidでdeb系ぽいLinux環境を実現できるTermuxからAndroidを操作するAPIのTermux-APIのupdateがありました.
Add a USB API compatible with libusb – see https://wiki.termux.com/wiki/Termux-usb for more information.
なんだか気になる更新内容です.
早速試してみます.
$ pkg update $ pkg install root-repo $ pkg install termux-api $ pkg install libusb $ pkg install clang
termux-usb
コマンドでデバイスを確認してアクセス許可を与える(ここではUSBメモリ)$ termux-usb -l [ "/dev/bus/usb/001/004" ] $ termux-usb -r /dev/bus/usb/001/004 Access granted.
アクセスの許可はAndroidの画面で操作が必要です.
ちなみに,USB Keyboardは認識できませんでした(Androidでは利用できているのに!)
$ cat << __EOF__ > usbtest.c > $ cat usbtest.c > #include <stdio.h> > #include <assert.h> > #include <libusb-1.0/libusb.h> > > int main(int argc, char **argv) { > libusb_context *context; > libusb_device_handle *handle; > libusb_device *device; > struct libusb_device_descriptor desc; > unsigned char buffer[256]; > int fd; > assert((argc > 1) && (sscanf(argv[1], "%d", &fd) == 1)); > assert(!libusb_init(&context)); > assert(!libusb_wrap_sys_device(context, (intptr_t) fd, &handle)); > device = libusb_get_device(handle); > assert(!libusb_get_device_descriptor(device, &desc)); > printf("Vendor ID: %04x\n", desc.idVendor); > printf("Product ID: %04x\n", desc.idProduct); > assert(libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, buffer, 256) >= 0); > printf("Manufacturer: %s\n", buffer); > assert(libusb_get_string_descriptor_ascii(handle, desc.iProduct, buffer, 256) >= 0); > printf("Product: %s\n", buffer); > assert(libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 256) >= 0); > printf("Serial No: %s\n", buffer); > libusb_exit(context); > } > __EOF__ $ gcc usbtest.c -lusb-1.0 -o usbtest $ termux-usb -e ./usbtest /dev/bus/usb/001/004 Vendor ID: 13fe Product ID: 3600 Manufacturer: Product: USB DISK 2.0 Serial No: 07AC10081C16381A
てことでTermuxからlibusbが使えるようになったようです.
ちなみに,lsusbを実行するとこんな感じです.rootedな端末だと使えるんでしょうけど.
$ lsusb lsusb: /sys/bus/usb/devices: Permission denied $ tsudo lsusb /data/data/com.termux/files/usr/bin/tsu: 146: exec: : Permission denied
$ dpkg-query -W termux-api libusb clang clang 8.0.1-4 libusb 1.0.23-rc1-1 termux-api 0.47 $ adb shell dumpsys package com.termux.api | grep -E 'versionCode|versionName' versionCode=38 minSdk=21 targetSdk=28 versionName=0.38 $ adb shell dumpsys package com.termux | grep -E 'versionCode|versionName' versionCode=75 minSdk=21 targetSdk=28 versionName=0.75 $ getprop ro.bootimage.build.fingerprint essential/mata/mata:10/QP1A.190711.122/420:user/release-keys $ getprop ro.build.version.security_patch 2019-09-05 $ getprop ro.product.cpu.abilist arm64-v8a,armeabi-v7a,armeabi
ffmpegでgifからmp4に変換した動画がInstagramに投稿できない
先日のttygifで作成したanimation gifをInstagramに投稿しようとしたところ,animation gifは投稿できるけどanimationせず1枚目の画像が表示されるだけです.ffmpegでmp4に変換するだけで良さそうだけど投稿できません.白い動画でプログレスがずっと表示され,「次へ」を押すとアプリ自体が落ちてしまいます.動画は同端末のvlcなどでは問題なく再生できています.
$ ffmpeg -i tty.gif tty.mp4
音声がないのがいけないのかな?と anullsrc
フィルタで無音の音声トラックを追加してみても変わらず.
$ ffmpeg -f lavfi -i anullsrc -i tty.gif -shortest tty.mp4
手詰まりになって検索してみると以下のページを発見.
このページによると以下の条件で投稿できないようです.
- 3秒以下の動画
- Instagramが受け付けないカラーエンコーディングの利用
今回の動画は20秒ほどなので長さは問題無さそうです.
うまく行っていなかった動画を確認すると元記事と同様 yuv444p
を使っているようです.
$ ffprobe tty.mp4 2>&1 | grep -E "Stream.*Video" Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 802x750, 73 kb/s, 4.17 fps, 4.17 tbr, 12800 tbn, 8.33 tbc (default)
てことで,以下のようにカラーエンコーディングに yuv420p
を指定して変換すると投稿できました.(音声トラックはあってもなくてもどちらでもOKだった)
$ ffmpeg -i tty.gif -pix_fmt yuv420p -filter_complex "scale=trunc(iw/2)*2:trunc(ih/2)*2" tty.mp4 $ ffprobe tty.mp4 2>&1 | grep -E "Stream.*Video" Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1058x750, 97 kb/s, 16.08 fps, 16.08 tbr, 12352 tbn, 32.17 tbc (default)
公式の文章があればいいんですが見つからず.以下が少し近い?
$ dpkg-query -W ffmpeg ffmpeg 7:4.1.4-1+b2 $ lsb_release -dr Description: Debian GNU/Linux bullseye/sid Release: unstable $ uname -m x86_64
$ adb shell dumpsys package com.instagram.android | grep -E 'versionCode|versionName' versionCode=175574628 minSdk=23 targetSdk=28 versionName=113.0.0.39.122 $ adb shell getprop ro.bootimage.build.fingerprint essential/mata/mata:10/QP1A.190711.122/420:user/release-keys $ adb shell getprop ro.build.version.security_patch 2019-09-05 $ adb shell getprop ro.product.cpu.abilist arm64-v8a,armeabi-v7a,armeabi
Android で Wi-Fi 経由の adb を有効にして backup
Android 端末側でUSB デバッグを有効にしてUSB接続する.
デバイスが認識されているか確認.
$ adb devices List of devices attached PM1LHMA861102833 device
HostPC の adb コマンドで tcpip
コマンドで接続できるようにして,connect
コマンドで Android 端末の ip を指定して接続します.
5555
はポート番号で 5555
が規定値.既定値から変更した場合は,connect
コマンドの ip の後ろにポート番号の指定が必要になります.
$ adb tcpip 5555 $ adb connect 192.168.1.200 connected to 192.168.1.200:5555
この状態でusb 接続を解除して devides
コマンドに居ます :)
後は普通に使えます.
$ adb devices List of devices attached 192.168.1.200:5555 device $ adb logcat|head -1 --------- beginning of crash ^C
そして本命のバックアップ.
$ time adb backup -f ./PH-1.ab -all Now unlock your device and confirm the backup operation... real 26m2.104s user 0m0.171s sys 0m5.725s
用事が終わったら切断しておいたほうが安心ですね.
$ adb disconnect 192.168.1.200 disconnected 192.168.1.200 $ adb devices List of devices attached
mata:/ $ getprop ro.bootimage.build.fingerprint essential/mata/mata:9/PQ1A.190105.058/496:user/release-keys mata:/ $ getprop ro.build.version.security_patch 2019-05-05 mata:/ $ getprop ro.product.cpu.abilist arm64-v8a,armeabi-v7a,armeabi
$ dpkg-query -W adb adb 1:8.1.0+r23-5 $ lsb_release -dr Description: Debian GNU/Linux 10 (buster) Release: 10 $ uname -m x86_64
Android 4.0 以降を DNS-over-HTTPS 対応にする Intra を少し試す
通常の DNS は暗号化されず改ざんが可能です.Intra は DNS を暗号化する DNS-over-HTTPS を Android 4.0 以降で利用できるようにするアプリです.
自分は基本的に出先では VPN を利用しているので必要ないかなと思うのですが,お手軽に無料でかつ古いデバイスにも対応しているので良さそうですね.ちなみにこの機能は Android Pie には標準搭載されているそうです.
#Wi-FiなんかでDNS改ざんして認証画面に飛ばしたりするようなのはどういう動きになるんだろう?