自作アプリの紹介です。Google Playへのリンクはこちら
数回に渡って投稿してきた「AndroidにUSBでカメラを繋ぎた〜い(^o^)/」の元となっているアプリを公開しました。
無料です・・・広告つけてるけど。要望が多ければ機能アップ+広告無しの有料版を作ろうかなぁどうしようかなぁ〜現在は、広告無し・録画時間制限なし・対応解像度追加した有料版(350JPY)も公開しています。
UsbWEBカメラへのアクセスにはlibusv/libuvcの2つのnativeライブラリをAndroid用に改造して使ってます。
改造版libusb/libuvcはこちらで公開していますGitHub(更にいくつか修正をしているので近日中に更新予定)
ちょっと頑張ればZxingと組み合わせてバーコードの読込みとかもできちゃいます。今のところ公開予定は無いけど。
USB Video Class(UVC)対応のWebカメラから静止画・動画をキャプチャするためのアプリです。
ルート権やROM焼きは必要ありません(買ってきたままのスマホ・タブレットにインストールするだけで動きます)。
別途市販のUVC対応のWebカメラが必要となります。また端末によっては市販のOTGケーブルが必要となります。
OTGケーブルって何(2014/08/23追記)
OTGとは、USB On-The-Goを略してUSB OTG、更に略してOTGです。って何の説明にもなってませんね。
簡単に言うと、USB機器同士を繋ぐための規格で、それをUSB機器に認識させるために必要なのがOTGケーブル(USBホストケーブル)です。単なるコネクタの変換ケーブルではありません※。
もともとUSBはパソコン等の「ホスト」(親となる機器)と、例えばマウスやキーボード、プリンタ、USBハードディスクと言った周辺機器(子となる機器)を接続するための規格でした。
ところが元々パソコン等に繋いだ時に子となるスマホやタブレットと言った機器へ、直接違う種類の子機器を繋ぎたいと思った人が居てて規格化されたのがUSB On-The-GO、と言うことらしいです。もっとも、キーボードとUSBハードディスクを繋いで・・・なんてことをしても殆どの場合は駄目ですよ。子としても親としても働ける機器・・・スマホやタブレットが必要になります。
Androidの場合には、子としても親としても働ける場合に、スペックにUSBホスト機能対応と書いてあることが多いと思います。2012年頃以降発売でAndroid4.xな端末は大抵対応していると思いますが、端末のスペック表等で確認して下さいね。
※OTGケーブルは中の結線が通常のものとは少し異なっていて、USB MiniB/MicroBコネクタの4番ピン(ID)が5番(GND)に落ちています。自作している人もいるみたいですが、100円から数百円程度なので普通は買った方が端末・USB機器を壊す心配がなくていいのでは無いかと思います。
機能
- 動画キャプチャ
外部ストレージのMovies/UsbWebCameraフォルダ内にMP4ファイルとして保存出来ます。
このアプリでは1回の動画キャプチャにつき最大3分間に制限しています。
画面下部右の静止画/動画切り替えスイッチを動画にしている時に、画面下部中央のキャプチャボタンを押すと動画キャプチャを開始/停止できます。 - 静止画キャプチャ
外部ストレージのDCIM/UsbWebCameraフォルダ内にpngファイルとして保存出来ます。
画面下部右の静止画/動画切り替えスイッチを静止画にしている時に、画面下部中央のキャプチャボタンを押すと静止画キャプチャできます。 - 繰返しキャプチャ
指定時間毎に指定回数の静止画・動画キャプチャを行うことが出来ます。画面下部中央のキャプチャボタン を長押しすると、繰返しキャプチャ動作となります。 - ミラー表示
左右反転・上下反転・上下左右反転が出来ます。静止画・動画キャプチャの保存の際には適用しません。 - 画面の回転制御
ミラー表示と似てるけど。端末の向きに合わせて画面を回転させるか、縦または横方向に固定するかを設定できます。 - 画面サイズ(表示および静止画/動画のキャプチャサイズ)
SD(640×480)およびHD(1280×720)に対応しています(カメラでサポートしている場合のみ) - カメラから取得する映像フォーマット
MJPEGおよびYUV2(YUV422)にの両方に対応しています。
カメラがMJPEGに対応している場合はMJPEGを優先して使用します。
特殊な機能は使用していないのと、MJPEGとYUV2の両対応なので、一般的なUVCクラス対応のWebカメラの多くでも使用可能と思われます。 - 最大FPSの制限
バッテリー消耗抑制のために、最大FPSを制限出来ます。
ただし、カメラの機種・画像サイズ・最大FPSの設定値によっては映像が表示されなくなることが有ります。
例えば、手元に有るELECOM UCAM-DLY300TAでは、HDサイズ(1280×720)はサポートしていませんし、SDサイズも30FPSのみしかサポートしていませんので、画像サイズをHDサイズに設定したり、最大FPSを30fps以外にすると画面が表示されなくなります。 - ディマー機能って言うのかな?
カメラ画像表示中は常に画面表示するようにしていますが、バッテリ消耗抑制のために、設定した一定時間後に画面を暗くできます。画面にタッチすると元の明るさに戻ります。
完全に画面OFFの状態でのキャプチャはサポートしていません。 - 十字線の表示のon/off切り替え
位置合わせ用に画面に十字線を表示できます。ただし十字線はキャプチャした静止画・動画には表示されません。 - 画像調整
ブライトネス(明るさ)、コントラスト、彩度、シャープネス、ガンマ、ゲイン、色合い、ホワイトバランスの調整が可能です。ただし、それぞれの機能をカメラがサポートしている場合だけ有効になります。 - その他
Logicool C910HD / Logicool C270 / ELECOM UCAM-DLY300TAと、Nexus7(2012, Android4.4.2) / Nexus5(Android 4.4.2 & 4.4.3) / Galaxy S3(SC-06D, Android 4.1.2)の組み合わせで動作確認しています。
※追記1:PCに接続した際に複合デバイス(Composite Device)として認識されるタイプのWebカメラ/ビデオキャプチャは動作しないものが一部あります。現在修正しているので動かない場合は今後のバージョンアップまでお待ちくださいm(__)mアプリバージョン1.06以降で対応しています。
※本アプリが起動しているかどうかに関係なく、カメラを端末に接続するだけで電池を消耗しますので、使用しない場合はカメラを取り外すようにお願いします。
※このアプリでは複数カメラの同時接続はサポートしていません。
※追記2:USB接続のWebカメラ/ビデオキャプチャは消費電力が多く端末の電池の消耗が早くなります(200mA以上流れるものが殆どです)。可能な場合はセルフパワーのUSBハブ(外部電源からUSB機器へ電源供給できるUSBハブ)を使用することをおすすめします。2014/08/23追記:Yケーブル(三叉ケーブル)でも大丈夫です。対応機種であればカメラ側へも端末側へも給電できるOTGケーブル兼用のものもあります
パーミッションについて
- 静止画・動画保存のために、外部ストレージアクセスのパーミッションを使用しています。
- 広告表示のために、ネットワークアクセスのパーミッションを使用しています。
- 繰返しキャプチャ開始時のフィードバックのために、バイブレーションのパーミッションを使用しています。
- 次バージョンでの音声同時キャプチャのために、録音のパーミッションを使用しています。
その他
- このアプリではMJPEGのデコード用にlibjpegを使用しています。
this software is based in part on the work of the Independent JPEG Group - USB Webカメラとの接続にlibusbおよびlibuvc, 静止画保存用にlibpngを使用しています。
Google PlayへのリンクはこちらUsbWebカメラ(広告付き通常版)
有料版はこちら:UsbWebカメラPro
コメント
早速の回答など、ありがとうございます。
端末機種:F-05E(docomo Tablet)
OS Ver.:4.1.2
ベースバンド:C_L1_042
カーネル:3.1.10
カメラはバッファローコクヨサプライの"BSW13KM01H"
こんなところでしょうか?!
カメラを認識しない時があるという事は、やはりこちらの端末の仕様や環境がおかしいのか?!
1度だけ3分撮れていました!
【新たな要望】
①設定された各種項目(モード)を画面の余ったところに表示出来ないか?
➁マイク内蔵カメラの場合は、本体ではないマイクを使える様にならないか?
③動画の録画は、ポーズが欲しい!・・・って要望ありませんか?
◆前回の要望を詳しく説明しますと・・・・・・。
録画ボタンや文字などは端末の画面サイズに対応した大きさにも出来るが、表示される映像のみは設定した解像度そのままと画面サイズに合わせた拡大表示を選択できる様にならないか?
いろいろ申し上げて恐縮ですが、同種のアプリがいくつかある中で一番うまく動いているアプリなので応援しております。
フィードバックありがとうございます。
カメラを認識しない時があるんですか?一度セルフパワーのUSBハブを挟んで動かしてもらえませんか?
完全にフリーズしたり勝手に再起動がかかってしまったりするパターンは経験上USBの電源周りで
不具合が起こっている可能性が高いようです。
アプリの内部でフリーズした場合・・・例えば無限ループに入ってしまった時などは、ANRと
言ってOS側からアプリが強制終了されるだけですが、(カーネルドライバ等の)OS内部
あるいはハードウエアでエラーが起きた時はフリーズや勝手に再起動となる事があるようです。
録画時間表示はAndroid5.0対応のための次回リリース時(12月半ば予定・・・もう少しです)
に実装予定です。
ボタンサイズ等は元々画面サイズと画面の向きに合わせて多少は変更しているんですけど、
10インチはちゃんと確認してませんでした。次回リリースには一回り大きくなります。
>>①設定された各種項目(モード)を画面の余ったところに表示出来ないか?
タブレットだと空いているように見えるんですけどねぇ(^_^;)
個人的には今でも画面に出すぎかなぁなんてことを思ったりもしますが、左下の
ツール表示ボタンを押した時の挙動が、現在は表示・非表示の2ステートになって
いるのを、ツール表示ON、ツール表示+設定表示、非表示の3ステートにするのは
可能なので、今後の検討課題にさせていただきます。画面右端または左端って感じ
ですかね。
これを知りたいって項目は何かありますでしょうか?
ちなみに文字表示は可能な限り避けたいです。
>>➁マイク内蔵カメラの場合は、本体ではないマイクを使える様にならないか?
これ(=USB接続の音声入力=UAC)は以前からの検討事項なのですが、現在の
リリースまでで使っていたlibusb/libuvcではかなり厳しいです。
次回リリースからはオレオレライブラリに移行するので、もしかすると対応
できるようになるかもしれません。
ただ、UACは音関係を何でもかんでも詰め込んだような規格なのでうまく
いくかどうかはまだわかりません。
>>③動画の録画は、ポーズが欲しい!・・・って要望ありませんか?
ポーズですか・・・今後の検討課題にさせていただきます。
某アプリの様にタッチしている間だけ録画なんて事も考えたりはするんですけど、
長押し(インターバル録画モードへの遷移)とか、ピンチ操作での画面ズーム
(実装予定)との兼ね合いもあって操作が複雑になってしまうかなぁと言う事で
現時点では実装していません。
よろしくお願いします。
GooglrPlayの方に不具合や要望を投稿させていただいておりますが、いろいろ不具合が起こっています。
上手く動いている時もありますが、下記の様な事が頻繁に起こります。
・動画を撮ったつもりでも、0byteのファイルが複数個出来ているだけの場合がある。
・録画終了した途端にフリーズして端末の電源も切れなくなる。→何とか強制的に切る。
・放置していて時間が経つと画面表示が消えるが、その後端末のボタンを押しても復帰せず、フリーズしている。
Android自体のシステム不安定かとも考えたのですが、そうでもなさそうです。
・・・・というのも、同じ端末を2台持っていますが、どちらでも発生します。
【要望】
①録画の経過時間表示が欲しい。
➁基本的にはスマートフォンの画面サイズで設計されていると思いますが、私はタブレットなので、録画の赤いボタンとか小さくて使いづらいです。
ボタンとかを画面サイズにより拡大表示できないでしょうか?
フィードバックありがとうございます。
>>動画を撮ったつもりでも、0byteのファイルが複数個出来ているだけの場合がある。
いくつかの機種では録画ボタンを押してから実際に録画が始まるまでに数秒以上かかるものがあります。
いろいろ試してはいるのですがなかなか改善に至らず申し訳ありません。
>>放置していて時間が経つと画面表示が消えるが、その後端末のボタンを押しても復帰せず、フリーズしている。
カメラからの映像を表示している最中は画面が消えない様に(スリープ状態にならない様に)制御しているのですが、
画面が消えてしまうのであれば、機種固有の設定やタスク制御系のアプリの影響のような気がします。
参考の為に端末の機種やOSのバージョンを教えていただけないでしょうか?
>>【要望】
>>①録画の経過時間表示が欲しい。
>>➁基本的にはスマートフォンの画面サイズで設計されていると思いますが、私はタブレットなので、録画の赤いボタンとか小さくて使いづらいです。
>>ボタンとかを画面サイズにより拡大表示できないでしょうか?
次回以降のバージョンアップの際に対応させていただきます。
よろしくお願いします。
UsbWebカメラを試しました。すばらしいです。
sakiさんは、mjpegでdecodeすることが分かっているけど、ちょっと聞きたいことは、 「libuvcで、H.264のデータをカメラから取得できますか?(decode不要)」
私のやりたいことは、ライブストリーミングのために、カメラから取得したH.264のストリーミングをAndroidプロキシとして、直接的にサーバーに転送することです。
こんにちは。
残念ながら今のlibuvcのままでは、payloadがH.264やVP8のデータは受け取れないです。
USB Video Classの仕様書を見た限りでは手を掛ければ行けそうだと思いますが、手元のカメラは古いのばかりで
H.264やVP8はサポートしてないので動作確認できないんですよね(´・ω・`)
しかもH.264対応(ハードウエアエンコーダ)してるのは高級品ばかりで高いんですよね…
手元のLogcoolC920HDは間違いでC910HDでしたm(__)m
ちなみに、UsbWebCameraではMJPEGまたはyuv2で受け取ったフレームデータをMediaCodecでAVC(H.264)に(ハードウエア)エンコードして
MPEG4として保存しています。
参考になりませんがm(__)m