AndroidでWebコンテンツの表示

AndroidでWebコンテンツの表示

Webコンテンツを表示するには
WebViewクラスのloadUri()を使う

まず、

private WebView mWebView;

でメンバ変数にする

次に、onCreate()の中で

mWebView = new WebView(this);
setContentView(mWebView);

でWebViewが使えるようにする

ただし、このままだとJavascriptが無効なので

mWebView.getSettings().setJavascriptEnabled(true);

でJavascriptを有効にする
そのぶんセキュリティーは落ちるので注意

あとは、表示するWebページを設定

mWebView.setWebViewClient(new WebViewClient());
mWebView.loadUri("http://www.google.co.jp");

あと、WebViewを扱うときには、終了したら破棄する処理も必要

[@Override]
public void onDestroy(){

super.onDestroy();

mWebView.stopLoading();
ViewGroup webParent = (ViewGroup)mWebView.getParent();

if(webParent != null){

webParent.removeView(mWebView);
}
mWebView.destroy();
}
[/java]

これは、AndroidのWebViewは
Javaプログラムだけでなく
ネイティブのCのコードも使っているかららしい

このため、WebViewを明示的に破棄しないと
メモリの解放ができない

このため、Activity.onDestroyハンドラでWebViewクラスの
destroy()を呼んでいる

また、このときに
removeView()でActivityから切り離してから
destroy()を呼ぶこと

これをやらないと
Error: WebViewdestroy() called while still attached
とエラーが発生する

アプリ内でYouTube再生

アプリ内でYouTube再生

Androidアプリ内でYouTubeを再生するには
VideoViewを使う
もしくは
Android YouTube Player API
を使う

Android YouTube Player APIを使う場合
Google Map のAPIを使うときみたいに
Google APIs ConsoleでAPIを使えるようにしておく必要がある

そして、
Simple API Accessの keyをメモしておく

ここまでできたら
Android YouTube Player APIをダウンロードする

これをダウンロードしたら解凍して
libsから
YouTubeAndroidPlayerApi.jar

プロジェクトへ追加する

Eclipseを使っているなら
libs以下へ配置すれび自動認識される

ここまでできたら
レイアウトファイルへ
YouTubeを再生するためのViewを追加する

<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

次に、Javaでの操作だけど
YouTubeを再生するためには
YouTubeBaseActivityを継承し
OnInitializedListenerを実装する必要がある

さらに
レイアウトファイルで追加したYouTubePlayerViewインスタンスへ
API key の設定も必要になる

まずは、継承から

extends YouTubeBaseActivity implements OnInitializedListener

を追加

次に、API キーなどを変数へ格納

private static final String DEVELOPER_KEY ="取得したAPIキー";
private static final int RECOVERY_DIALOG_REQUEST = 1;

次に、onCreate()の中で
YouTubePlayerViewへDeveloperキーを設定

YouTubePlayerView youtubeView = (YoutubePlayerView)findViewById(R.id.youtube);

youtubeView.Initialize(DEVELOPER_KEY, this);

次に、初期化失敗のときの処理

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason){

//初期化失敗の処理
if(error.Reason.isUserRecoverableError()){
//エラー回避可能ならダイアログで表示
errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();

}else{
//エラー回避不可能ならトーストで表示
String errorMessage = String.format(getString(R.string.error_player),
errorReason.toString());
Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show();
}
}

そして、初期化成功のときの処理

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored){

//YouTubeの動画Idを設定
if(!wasRestored){
player.cueVideo("再生したい動画のID");
}
}

また、YouTubeにアクセスするということで
AndroidManifest.xmlへ
インターネットにアクセスする権限を追加する

<uses-permission android:name="android.permission.INTERNET"/>

このように、YouTubePlayerViewを使うことで
動画再生のためのボタンやフルスクリーン機能なども自動で実装される

このあたりの制御には
YouTubePlayerViewクラスに実装されているメソッドを使う

APIや制御方法などは、Google Map APIに近い

あと、YouTubeの動画IDは
YouTubeのURLの中の
https://www.youtube.com/watch?v=
の後の部分になる

raspberry pi でカメラモジュール

raspberry pi でカメラモジュール

カメラモジュールを raspberry Pi 本体に追加し
電源を入れる

今回もamazon で購入してみた
使用したのは
ラズベリーパイ カメラモジュール Camera Module for Raspberry Pi

今回もリモートで実行

まず
SSH でログインして
次に

sudo raspi-config

で設定画面を開く

raspi_camera

設定で
Enable Camera を選択し

Enable support for Raspberry Pi camera
とカメラをサポートするか聞かれるので
Enable にして有効化

raspi_camera2

そして設定画面を終了すると再起動するか聞かれるので再起動

これで設定が反映されるので
撮影はコマンドからできる

しっかり接続できていないと

mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

と表示されてしまう

接続方法については
http://www.raspberrypi.org/help/camera-module-setup/
の動画を参考にさせていただきました

raspberry pi カメラモジュール
で検索するともっとでるかも

接続できたらログインして

raspistill -o image.png

で撮影できる

ちなみに、このときに raspberry pi とディスプレイを
HDMI ケーブルでつないでおけば
画面にカメラの画像がでる
基本的には5秒プレビューしてから撮影だけど

-t オプションを指定してミリ秒単位で指定もできる

1秒は1000ミリ秒
なので1秒後とかなら

raspistill -o image.png -t 1000

とすればいい

プレビュー画面なんていらない
というなら
-n オプションをつけるとできるけど
この場合、画面が綺麗に写らないことがあるようなので注意

また解像度の指定もできる
デフォルトでは
2592 x 1944 ピクセル

これも
-w オプションで幅
-h オプションで高さ
を指定できる

1秒間のプレビューと、 640x 480 の画像で撮影するなら

raspistill -o image.png -t 1000 -w 640 -h 480

とすればいい

オプションはたくさんあるので

raspistill 

でオプションヘルプをみるとわかりやすい

なお、ディスプレイではなく
端末画面に表示するなら

sudo apt-get install fbi

で fbi をインストールし、これを使う

fbi -a image.jpg 

で実行

ただし、リモートではできず本体の場合のみできた

Androidでビデオ再生

Androidでビデオ再生

ビデオなどの動画再生は、VideoViewを使う

VideoViewは、MediaPlayerに似てるけど
こっちは、あらかじめレイアウトファイルへ組み込むことができる

まず、レイアウトファイルへ

<VideoView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

そして、Javaで
VideoViewのインスタンスを取得し
動画のURIを設定してから
VideoView.start()で再生する

VideoView video = (VideoView)findViewById(R.id.video);

//res/raw/sampleを取得
video.setVideoUri(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sample));

//動画の再生開始
video.start();

なお、VideoViewに設定できる動画は
ローカルファイルを直接指定するか
もしくは
ネットワークやリソースフォルダのファイルを指定することになる

ローカルファイルを設定するなら
VideoView.setVideoPath(String)
を使う

ネットワークやリソースフォルダを指定する場合は
Uriでパスを作成して
VideoView.setVideoUri(Uri)
で設定する

そして、設定してから
VideoView.start()で再生

MediaPlayerと違うのは、あらかじめ読み込む処理がいらないこと

ちなみに、再生の停止は
VideoView.pause()

再生位置を指定するなら
VideoView.seekTo(long)
を使う

音楽情報を通知領域へ表示

音楽情報を通知領域へ表示

通知領域へ音楽情報を表示するには
独自にNotificationのレイアウトを作成し
音楽の再生、停止、のタイミングでNotificationに設定する

ServiceへNotificationを設定
この処理のタイミングは
音声データの再生のタイミングにする

まず、Notificationの登録

startForeground(1, generateNotification());

generateNotification()の中身は以下のようになる

//通知領域タップ時のPendingIntent作成
Intent actionIntent = new Intent(getApplicationContext(), MainActivity.class);

PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, actionIntent, PendingIntent.FLG_UPDATE_CURRENT);

//独自レイアウトのRemoteView作成
RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.status_bar);

//Notification生成
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());

//アイコン設定
builder.setSmallIcon(R.drawable.ic_start_media);

//独自レイアウトをNotificationへ設定
builder.setContent(notificationView);

//設定をtrueにして常時表示
builder.setOngoing(true);

//通知領域に初期表示のときの設定
builder.setTicker("sample title を設定");
builder.setContentIntent(pi);

//statusbar のアイコン設定
notificationView.setImageResource(R.id.imageIcon, R.drawable.ic_launcher);

//status barへタイトル設定
notificationView.setTextViewText(R.id.textTitle, "Sample title");

//status barへアーティスト名表示
notificationView.setTextViewText(R.id.textArtist, "Sample Artist");

//イメージアイコンボタンを押したときのIntentの設定
PendingIntent contentIntent   = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), Intent.FLAG_ACTIVITY_NEW_TASK);

notificationView.setOnClickPendingIntent(R.id.imageIcon, contentIntent);

//再生、一時停止を押したときのIntentの設定
notificationView.setOnClickPendingIntent(R.id.play, createPendingIntent("playpause"));

//次へボタンを押したときのIntent設定
notificationView.setOnClickPendingIntent(R.id.next, createPendingIntent("next"));

return builder.build();

サービスが終了すると
自動的にNotificationは終了するけど
明示的に通知領域から解除するには

stopForeground(true);

とする

startForeground()を使うと
Serviceは、システムから強制停止できなくなる

音楽の再生や動画再生みたいに長時間バックグラウンドで動作するサービスの場合
Notificationなどを使って通知領域へサービスの有無を表示するのが一般的

残念ながら、現時点では、表示領域からのアイコンによる操作は
標準ではサポートされてないため
Notificationの独自レイアウトを作成し
そこへ各機能のボタンなどを配置して
RemoteViews経由でIntentを設定していく

音楽情報をロックスクリーンへ表示する

音楽情報をロックスクリーンへ表示する

ロックスクリーンに音楽情報を表示するには
RemoteControlClient

LockScreenに表示する状態を設定し
AudioManagerクラスの
registerRemoteControlClient()
で登録すれば使える

まず LockScreenで押されたボタンのイベントを受け取るレシーバーのPendingIntentを生成

Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
mediaButtonIntent.setComponent(mComponentName);

PendingIntent mediaPendingIntent = PendingIntent.getBroadCast(getApplicationContext(), 0, mediaButtonIntent);

次に、RemoteControlClientを生成、PendingIntentを設定

remoteControlClient = new RemoteControlClient(mediaPendingIntent);
remoteControlClient.setTransportControlFlags(
  RemoteControlClient.FLAG_KEY_MEDIA_PLAY | 
  RemoteControlClient.FLAG_KEY_MEDIA_PAUSE |
  RemoteControlClient.FLAG_KEY_MEDIA_NEXT | 
  RemoteControlClient.FLAG_KEY_MEDIA_STOP
);

そして、RemoteControlClientの登録

mAudioManager.registerRemoteControlClient(remoteControlClient);

そして、AudioFocusの取得
mAudioManager.registerAudioFocus(new AudioFocusChangeListener(){

@Override
public void onAudioFocusChange(int focusChange){

Log.d(TAG,”Focus changed: ” + focusChange);
}
},
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
[/java]

次に、ロックスクリーンに表示する曲情報やボタン状態を設定

//ロックスクリーンの状態を再生に設定
remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING);

//ロックスクリーンに表示する音楽情報を設定
remoteControlClient
.editMetadata(true)
.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "Sample Artist")
.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "Sample Album")
.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "Sample Music")
.apply();

そして、この設定を解除するには
AudioManagerクラスの
unregisterRemoteControlClient()
で解除する

mAudioManager.unregisterRemoteControlClient(remoteControlClient);
remoteControlClient = null;

ロックスクリーンに曲情報を表示するときの注意点は
registerMediaButtonEventReceiver()
によるBroadCastReceiverの登録
そして
AudioFocusの取得
を行うこと

これをやらないと、表示されないので注意

また、ロックスクリーンのボタンの状態は
MediaPlayerの再生とは
自動では連動しないので
状態に合わせて、プログラム側で
RemoteControlClientクラスの
setPlaybackState()で値を設定する必要がある

音声の録音

音声の録音

Androidで音声の録音をするには
MediaRecorderを使う

これを使うことで録音や録画ができる

以下は初期化から録音まで

//MediaRecorder初期化
if(mMediaRecorder == null){
 mMediaRecorder = new MediaRecorder();
}

//入力をマイクへ設定
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

//保存フォーマットを3gpに設定
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

//Audioエンコードをデフォルトへ
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

//microSDへ名前を指定して保存
String fileName = "recorder.3gp";
mFilePath = Environment.getExternalStorageDirectory() + "/" +fileName;
mMediaRecorder.setOutputFile(mFilePath);

//録音準備完了なら録音開始
try{

mMediaRecorder.prepare();
}cash(Exception e){
 e.printStackTrace();
Log.e(TAG, e.toString(), e);
}

なお、録音停止は、MediaRecorder.stop()を使う

if(mMediaRecorder != null){

mMediaRecorder.stop();
mMediaRecorder.release();
}

また
録音機能には権限が必要になるため
AndroidManifest.xmlへ

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

が必要になる

また、microSDへの保存についても権限が必要になる

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

を追加する

MediaRecorderは、初期化設定して
MediaRecorder.prepare()を読んで準備し
MediaRecorder.start()で録音開始

初期化のときに音声なのか
映像なのかにより初期化方法は異なる

そして、録音のポイントは
オーディオソースの設定
オーディオ出力の設定になる

一般的な録音でいいけど
もし録音した音声が音割れするなら
MediaRecorder.setAudioSource()の引数へ
MediaRecorder.AudioSource.VOICE_RECOGNITION
を設定すると改善させることがある

音声の再生

音声の再生

MP3ファイルや、応答性の求められない音声データの再生は
android.mediaパッケージの
MediaPlayerクラスを使う

MediaPlayer.setDataSource()
で音声データを設定し

MediaPlayer.start()で再生する

ほとんどの場合、再生ボタンを押して再生になるので

implements OnClickListener, OnPreparedListener, OnCompletionListener

を追記する

そして、メンバ変数の宣言

private Button playPause;
private MediaPlayer mediaPlayer;

そして、onCreate()へ処理を追記する

playPause = (Button)findViewById(R.id.playpause);
playPause.setOnClickListener(this);
playPause.setEnabled(false);

//MediaPlayer 初期化
mediaPlayer = new MediaPlayer();

//再生準備完了の通知を受け取るリスナーの設定
mediaPlayer.setOnPreparedListener(this);

//再生完了の通知を受け取るリスナーの設定
mediaPlayer.setOnCompletionListener(this);

//再生させたい音声データのパス設定
String fileName = "android.resource://" + getPackageName() + "/" + R.raw.bgm;

try{

//音声データをMediaPlayerへ設定
mediaPlayer.setDataSource(this, Uri.parse(fileName));

//音声データを非同期で読み込む
mediaPlayer.prepareAsync();
setButtonText(mediaPlayer);

}catch(IllegalArgumentException e){
 e.printStackTrace();

}catch(SecurityException e){
e.printStackTrace();

}catch(IllegalStateException e){
e.printStackTrace();

}catch(IOException e){
 e.printStackTrace();
}

そして、アプリ終了のときの処理

@Override
public void onDestroy(){
super.onDestroy();

//再生中なら停止させる
if(mediaPlayer.isPlaying()){
 mediaPlayer.stop();
}

//MediaPlayerの解放
mediaPlayer.release();
}

メモリ操作みたいに解放が必要になる

そして、ボタンを押したら再生、停止する処理

@Override
public void onClick(View v){

if(v.getId() == R.id.playpause){
//再生中なら停止させる
if(mediaPlayer.isPlaying()){
 mediaPlayer.pause();
 setButtonText(mediaPlayer);
}
//再生中でないなら再生させる
else{
mediaPlayer.start();
setButtonText(mediaPlayer);
}
}
}

音楽データが再生可能になったときの処理

@Override
public void onPrepared(MediaPlayer mp){
playpause.setEnabled(true);
setButtonText(mp);
}

そして、音楽の再生終了したときにボタンの状態を変える処理

@Override
public void onCompletion(MediaPlayer mp){

setButtonText(mp);
}

ボタンの状態変化の処理
ここでは、表示されるラベルを変更する
ちなみに、これはユーザー関数

private void setButtonText(MediaPlayer mp){
//再生中なら停止へ
if(mp.playing()){
playpause.setText(getString(R.string.stop));

}
//停止中なら再生へ
else{
playpause.setText(getString(R.string.play));
}
}

MediaPlayerクラスは
内部で音楽情報を保持しているため
呼び出し側は、それを考慮して
start()
pause()
を呼び出さないとだめ

もし、呼び出してはならないほうを使うと
IllegalExceptionが発生する

今回は、MediaPlayerを初期化して

再生準備完了のpreparedと
再生完了の playbackCompletedの
状態を受け取るためのリスナーを設定し
これらが呼ばれるまで
ボタンのラベルを停止、再生と切り替えるようにしている

効果音の再生

効果音の再生

Androidの効果音の再生のときには
応答性が速く、短い音声データの再生になるので
android.mediaパッケージの
SoundPoolクラスを使う

res/rawsに音声データ配置して
SoundPool.load()
で読み込んで
SoundPool.play()
で再生する

大抵はタッチしたら音を鳴らすので

implements OnClickListener, OnLoadCompleteListener

を追加する

次に、メンバ変数の宣言

private SoundPool mSoundPool;
private int mSoundID;

あとは、onCreate()の中へ動作の追加をする
まずは、ボタンのインスタンスの取得

findViewById(R.id.button).setOnClickListener(this);
findViewById(R.id.button).setEnabled(false);

//SoundPool初期化
mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

//音声データの読み込み終了を検知するリスナーの設定
mSoundPool.setOnCompleteListener(this);

//音声データの読み込み開始
mSoundID = mSoundPool.load(this, R.raw.test, 1);

そして、画面破棄したときにSoundPoolを解放するので

@Override
public void onDestroy(){

super.onDestroy();
mSoundPool.release();
}

クリック時の処理も実装

@Override
public void onClick(View v){

if(v.getId() == R.id.button){
//音声の再生
mSoundPool.play(mSoundID, 1.0F, 1.0F, 0,0,1.0F);
}
}

そして、読み込み完了したときの処理を
onLoadComplete()へ実装

@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status){

//音声が読み込み完了したら再生ボタンを有効にする
findViewById(R.id.button).setEnabled(true);
}

最初は
setEnabled(false)でボタン無効化しておき
音声が再生できるようになってから
setEnabled(true)でボタンを押せるようにしている

SoundPool()
の初期化パラメーターは

第1引数は、再生されたSoundPoolで同時再生できる数
今回は1

第2引数は、音声の出力先
今回は、res/raws/でのデータを使ったけど
定数も使える
AudioManager.STREAM_ALERM
アラーム音

AudioManager.STREAM_NOTIFICATION
通知音

AudioManager.STREAM_DTMF
トーン信号音

AudioManager.STREAM_RING
着信音

AudioManager.STREAM_SYSTEM
システム音
となる

第3引数は、再生品質 デフォルトでは0になる

SoundPoolの初期化後、再生したい音楽データをメモリ上にロードする必要があるため
load()を使う

load()の引数は
第1引数は、Contextの設定

第2引数は、再生した音声のリソースID

第3引数は、再生品質を指定する
再生品質は、1が推奨となっている

今回なら
load(this, R.raw.test, 1)
となる

load()を実行すると、戻り値に
int型の soundIDが帰ってくる

soundID は、
読み込まれた音声データの番号なので
あとで再生するのに使う

再生については、自動では再生されないため
取得した soundIDを引数にして
play()で再生する

Raspberry Pi でWebカメラ

Raspberry Pi でWebカメラ

Raspberry Pi にはCSIコネクタにさす専用のコネクタもあるけど
USB接続の Webカメラも使える

UVC対応なら、ドライバをインストールしなくても
させば使える

今回、使った web カメラは
iBUFFALO マイク内蔵320万画素WEBカメラ F2.2ガラスレンズ搭載モデル シルバー BSW32KM03SV

raspberry pi は
Raspberry Pi Type B 512MB ケースセット Pi Tin for the Raspberry Pi – Clear

また電源確保のためセルフパワーのUSBハブを利用
iBUFFALO USB2.0ハブ セルフ&バスパワー 4ポート ACアダプタ付 ブラック 【PlayStation4,PS4 動作確認済】 パソコン/液晶TV[REGZA][AQUOS]対応 BSH4A01BK

まずは web カメラを USBにさす

次に

sudo tail -f /var/log/messages 


webカメラが使えるか調べる

今回のログは

Aug 13 10:49:38 raspberrypi kernel: [ 2511.592147] usb 1-1.3.3: Manufacturer: Etron Technology, Inc.
Aug 13 10:49:38 raspberrypi kernel: [ 2511.789941] media: Linux media interface: v0.10
Aug 13 10:49:38 raspberrypi kernel: [ 2511.819490] Linux video capture interface: v2.00
Aug 13 10:49:38 raspberrypi kernel: [ 2511.856057] uvcvideo: Found UVC 1.00 device BUFFALO BSW32KM03 USB PC Camera (2084:0d03)
Aug 13 10:49:38 raspberrypi kernel: [ 2511.863885] uvcvideo: UVC non compliance - GET_DEF(PROBE) not supported. Enabling workaround.
Aug 13 10:49:38 raspberrypi kernel: [ 2511.870234] input: BUFFALO BSW32KM03 USB PC Camera as /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3.3/1-1.3.3:1.0/input/input2
Aug 13 10:49:38 raspberrypi kernel: [ 2511.874302] usbcore: registered new interface driver uvcvideo
Aug 13 10:49:38 raspberrypi kernel: [ 2511.874336] USB Video Class driver (1.1.1)
Aug 13 10:49:38 raspberrypi kernel: [ 2512.005222] usb_audio: Warning! Unlikely big volume range (=4096), cval->res is probably wrong.
Aug 13 10:49:38 raspberrypi kernel: [ 2512.005260] usb_audio: [3] FU [Mic Capture Volume] ch = 1, val = -4097/-1/1<6>[ 2512.012606] usbcore: registered new interface driver snd-usb-audio

今回の確認項目は

Aug 13 10:49:38 raspberrypi kernel: [ 2511.856057] uvcvideo: Found UVC 1.00 device BUFFALO BSW32KM03 USB PC Camera (2084:0d03)

これが
USBカメラの型番

Aug 13 10:49:38 raspberrypi kernel: [ 2511.874302] usbcore: registered new interface driver uvcvideo

これが
ドライバ uvcvideo が読み込まれたことを示す

Aug 13 10:49:38 raspberrypi kernel: [ 2512.005260] usb_audio: [3] FU [Mic Capture Volume] ch = 1, val = -4097/-1/1<6>[ 2512.012606] usbcore: registered new interface driver snd-usb-audio

これが
サウンドドライバ snd-usb-audio 
が読み込まれたことを示す

次に表示の確認や画質コントロールソフトをインストール

sudo apt-get install uvccapture uvcdynctrl guvcview 

これで本体をディスプレイにつなげればデスクトップ環境で使うことができる

次に
Raspberry Pi 単体で動画配信できるようにする

ホームサーバーなどではこっちを使う

これには MJPG-streamer をつかう

これを使えば、パソコンやスマホブラウザで
Raspberry PI にアクセスすることで使うことができる

ただし MJPG-streamer をインストールするのに
apt-get ではできないので
Subversion をつかう

sudo apt-get install subversion libjpeg-dev imagemagick

次に MJPEG-stremer のソースをsuvbersion でダウンロード

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして、コンパイル

cd mjpg-streamer/
make
sudo make install

これでインストール完了

次に MJPEG-streamer の起動

これはスクリプトファイルを作成して実行する

320 x 249 ピクセルの動画を
10fps
これは1秒間に10コマの間隔で配信し
ブラウザはIDとパスワードでアクセスする

今回は ID test パスワード 1234 にする

sudo vim stream.sh

でファイルを作成

#!/bin/bash
PORT="8080"
ID="test"
PW="1234"
SIZE="320x240"
FRAMERATE="10"

export LD_LIBRARY_PATH=/usr/local/lib
mjpg_streamer \
        -i "input_uvc.so -f $FRAMERATE -r $SIZE -d /dev/video0 -y" \
        -o "output_http.so -w /usr/local/www -p $PORT -c $ID:$PW"

そして

chmod 755 stream.sh 

で権限変更

これで
./stream.sh
で実行し
ブラウザで
http://192.168.1.198:8080
でアクセス

ユーザ名 test
パスワード 1234
でアクセスはできたけど
なぜか画像が砂嵐状態

検索して
http://homebrew.jp/show?page=1445
を参考に

sudo ./mjpg_streamer -i "./input_uvc.so -f 15 -r 640x480 -d /dev/video0" -o "./output_http.so -w ./www -p 8080" 

を実行したら動いたので修正

これで再度

./stream.sh 

を実行すれば webカメラの画像が表示される