Creazy! https://creazy.net WEBエンジニア・ヤガーのテック・ガジェットブログ Thu, 11 Aug 2022 10:47:18 +0000 ja hourly 1 https://wordpress.org/?v=6.0.9 https://creazy.net/wp/wp-content/uploads/2017/12/cropped-favicon-32x32.png Creazy! https://creazy.net 32 32 何曜日の何時ころがピークなのか分かりやすいヒートマップ的な分布を出すSQL https://creazy.net/2022/08/heatmap-sql.html https://creazy.net/2022/08/heatmap-sql.html#respond Thu, 11 Aug 2022 10:47:18 +0000 https://creazy.net/?p=2872 ご無沙汰しております。ヤガーです。 すっかりエンジニア的な投稿をしなくなってしまったんですが、食っていかないといけないわけでずっとプログラム書き続けております(笑) 昨今ではプログラミングはどんどん高 ...

The post 何曜日の何時ころがピークなのか分かりやすいヒートマップ的な分布を出すSQL first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
ご無沙汰しております。ヤガーです。

すっかりエンジニア的な投稿をしなくなってしまったんですが、食っていかないといけないわけでずっとプログラム書き続けております(笑)

昨今ではプログラミングはどんどん高度化され、データベースの操作は全てGUIだったりフレームワークのORMだったりでSQL書ける人が私も含む老害ばかりという悲しい状況になっておりますが、久しぶりにそれすごいですねと言われたので紹介しておきます。

サービス分析によく使われるヒートマップ

サービス運営をしていて分析などする場合、ヒートマップというグラフを使うことがあります。
例えば、Google Analyticsで曜日と時間でどの時間帯にアクセスが多いのかというのがわかりやすくなります。

他にもヒートマップは、サイト上のどのあたりがよくクリックされるかなどでも使われますね。
で、この曜日と時間で2軸を作る分析はデータベースを持っていればよく使えるものだと思うのですが、意外と簡単に出す方法が思いつかないようで、SQLで出す方法をご紹介します。

datetime型のカラムを曜日・時間で集計するSQL

もったいぶっても仕方ないのでいきなり正解を書いておきますね。
ちなみにMySQLでの実現方法です。

SELECT
  DATE_FORMAT(created,'%H') as `時間`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 0 THEN 1 ELSE 0 END ) as `日曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 1 THEN 1 ELSE 0 END ) as `月曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 2 THEN 1 ELSE 0 END ) as `火曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 3 THEN 1 ELSE 0 END ) as `水曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 4 THEN 1 ELSE 0 END ) as `木曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 5 THEN 1 ELSE 0 END ) as `金曜`
, SUM( CASE WHEN DATE_FORMAT(created,'%w') = 6 THEN 1 ELSE 0 END ) as `土曜`
FROM reports
GROUP BY `時間`
ORDER BY `時間` ASC;

そうすると下記のような結果を取得できました。

SQLで直接グラフは出せませんので、数字で集計されていますが、これを元にスプレッドシートなりHTMLなりで色付けすればいいことは分かりますね。

SQL解説

MySQLなので日付をフォーマットする DATE_FORMAT 関数を使います。
今回起点にしているのは reports というテーブルの登録日時を入れている created というカラムです。
恐らくどんなテーブルにも created や create_date のようなカラムを用意していると思うのでそれを使うイメージです。

まず、 DATE_FORMAT(created,'%H') で時間ごとにグループ化することは割と簡単に思いつくと思います。
それと同時に曜日のカウントをどうするかなんですが、CASE文で曜日を判断し、特定の曜日だけカウントアップするカラムを日〜土まで用意してあげればいいのです。

ちなみに、PostgreSQLだと日付フォーマットの関数が TO_CHAR になるのでそこだけ差し替えれば使い回せますね。

今回は全データを参考にしていますが、短い期間の集計をする場合、日曜から土曜日までの区切りで期間設定してあげないと曜日によって集計回数が異なってしまう場合があるので、WHERE句を追加して調整しましょう。

§

誰かのお役に立つことを祈って。

The post 何曜日の何時ころがピークなのか分かりやすいヒートマップ的な分布を出すSQL first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2022/08/heatmap-sql.html/feed 0
「ツイポーート/twport」2022年6月いっぱいでレポートの公開機能を終了します【8/1 22時からメンテナンス】 https://creazy.net/2022/06/twport-closed-public-report.html https://creazy.net/2022/06/twport-closed-public-report.html#respond Thu, 16 Jun 2022 01:01:10 +0000 https://creazy.net/?p=2863 Twitterの検索結果をレポートとして保存できるツイポーートですが、すでに機能開発を終了し必要最低限のメンテナンスを継続している状況です。一方、Twitterを使ったキャンペーンなど集計に使える数少 ...

The post 「ツイポーート/twport」2022年6月いっぱいでレポートの公開機能を終了します【8/1 22時からメンテナンス】 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
Twitterの検索結果をレポートとして保存できるツイポーートですが、すでに機能開発を終了し必要最低限のメンテナンスを継続している状況です。一方、Twitterを使ったキャンペーンなど集計に使える数少ないサービスとしてご愛用いただいており、できる限り生きながらえればと考えております。

しかし、サービス運用を続けているとどうしても様々な問題が発生し対応に時間とコストがかかってしまいます。前回のお知らせでデータ容量逼迫については定期的に古いデータを削除させていただく仕様変更で対応させていただきました。

「ツイポーート/twport」Twitter APIのTLS1.2対応他/今後の旧データ削除方針について

今回は新たな問題対応のため、レポートの公開機能を停止することにいたしました。
この記事では公開機能停止にいたった要因と、スケジュールなどについてお知らせいたします。

レポートの公開機能とは

もともとはTwitter検索結果を簡単にレポートとして残し関係者に共有できればいいなという部分と、簡易分析として人気の画像や投稿者などを集計する機能をつけたものでした。新着一覧、カテゴリーごとの一覧、投稿者ごとの一覧などを経てレポート詳細をみられるようにしています。

当初、他のサービスのようにTweetの順番を変えたりする方法はコンテクストを変えてしまうためツイポーートでは採用しないと固く決めたので、あくまで検索条件でフィルターした結果を表示/非表示するというくらいの機能しかつけなかったんですが、その後Twitter自体がエンゲージメントによる部分表示を標準化していくなど調整されたタイムラインが当たり前の時代になってしまいました。Tweet数が爆発的に増えてしまったという背景も含めこのような流れは受け止めていますが、ツイポーートのレポート表示は少し時代にそぐわない状態になっていると理解しています。

公開機能を持っているために起こるリスク

このような状態で運営を続けてきて、度々発生するのが問題ツイートを含むまとめレポートに対する非公開依頼です。誹謗中傷や差別を含むツイートが炎上するなどが日常茶飯事になっておりますが、そういったツイートを含むレポートや、レポートタイトルや恣意的なツイートの集め方によって風評被害をもたらすような可能性のあるものが、度々被害者や代理人から削除依頼があり強制非公開対応するケースがありました。

基本的に非営利で私一人で運営しているため、このようなケースがあると状況確認や更新対応などで時間を取られてしまい負担となっておりました。

また、現在のツイポーートの強みと使われ方としてどちらかというと分析機能やCSV/TSVでエクスポートできる部分を評価されていると感じているため、申し訳ありませんが公開機能の停止を判断させていただいた次第です。

レポートの公開機能機能停止の影響

下記の機能が使えなくなります。

・トップページへの新着記事表示
・新着記事一覧表示
・カテゴリー別記事一覧表示
・ユーザー別記事一覧表示
・記事詳細

ですので、非ログイン状態でみられるのは実質トップページとログインページくらいとなります。

また、管理画面の使い勝手はほぼ変わりませんが、記事公開がなくなりましたので、「公開/非公開」の切り替え機能はなくなります。

公開されていた記事はどうなるか?

公開されていた記事は、公開機能停止に合わせて全て非公開状態に更新させていただきます。
ダッシュボードには残っておりますのでシステムから即時削除されるわけではありません。

一方、公開レポートはこれまで削除対象ではありませんでしたが、一括で非公開になるため削除対象となります。
通常は最終更新日時から3ヶ月以上経つと更新不可となり、6ヶ月以上経つと自動削除となります。
※詳細は下記ページをご覧ください。
「ツイポーート/twport」Twitter APIのTLS1.2対応他/今後の旧データ削除方針について

ただし、公開だったレポートは一括非公開にした時に最終更新日時を実施日に変更いたしますのですくなくとも6ヶ月間は保持されますのでご安心ください。

公開機能は6月いっぱい有効

公開機能は今月2022年6月いっぱいは利用可能です。

現在の予定では2022年7月2日(土) 0時〜6時の予定でメンテナンスを行う予定です。

【2022-07-01 追記】
調整の目処が立たないためメンテナンスのタイミングは別途アナウンスいたします。

【2022-07-31 追記】
8/1 22時からメンテンナンスを行います。最大数日サービスが利用できない可能性がございますのでご了承ください。

※メンテナンス中はサービスを利用することができません。
メンテナンス終了後は公開機能は停止されています。

§

長らくツイポーートに公開レポートを投稿し続けてくださった方々もおりますので大変心苦しい思いですが何卒ご理解いただけますと幸いです。

現在メインで使われているRTキャンペーンなどの分析については今後も利用できるようにする予定です。場合によってはそういった用途に特化した機能があってもいいかもしれません。

ご意見ご要望はTwitterの @twport アカウントまでお寄せくださいませ。

The post 「ツイポーート/twport」2022年6月いっぱいでレポートの公開機能を終了します【8/1 22時からメンテナンス】 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2022/06/twport-closed-public-report.html/feed 0
WordPressでstyle.cssを更新したらwp_enqueue_styleでキャッシュクリアする https://creazy.net/2022/01/wordpress-style-css-cache-clear.html https://creazy.net/2022/01/wordpress-style-css-cache-clear.html#respond Fri, 28 Jan 2022 00:27:37 +0000 https://creazy.net/?p=2850 どうも、ヤガーです。 しばらくWEB技術ネタを投稿していませんが、頻繁に使うテクニックについてはちゃんとブログに残していこうと思います。 企業HPなどを制作する時に、長い間Wordpressが使われて ...

The post WordPressでstyle.cssを更新したらwp_enqueue_styleでキャッシュクリアする first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

どうも、ヤガーです。

しばらくWEB技術ネタを投稿していませんが、頻繁に使うテクニックについてはちゃんとブログに残していこうと思います。

企業HPなどを制作する時に、長い間Wordpressが使われていると思いますが私ヤガーも基本的にはWPを使って構築します。案件によって最適なテーマを選択したり、プラグインなどを開発したりしますが多かれ少なかれデザインを調整するのにstyle.cssを編集することになります。モダンなブラウザでは表示速度の高速化のために、一度アクセスしたファイルを一時的に保管し二回目以降は保管されたファイル(キャッシュ)から表示するため表示が早くなるという仕組みがあります。しかし、開発中の場合は頻繁にCSSを編集するためこのキャッシュが邪魔になることが多いため、CSSが編集されたら適宜キャッシュがクリアされるようにします。

確認環境

WordPress 5.9

完成コード

まずは最終的なコードを確認していただきましょう。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

このコードをご利用テーマのfunctions.phpに追記します。
続けて解説をしていきます。

wp_enqueue_style

説明
WordPress が生成したページに CSS スタイルファイルを安全に (キューへ) 追加します。wp_register_style() で予め登録されていれば、そのハンドルを使って追加できます。

via: 関数リファレンス/wp enqueue style – WordPress Codex 日本語版

WPの作法としてスタイルシートをheadに記述する時にwp_register_styleを使うことになっており、それを変更・追加する場合はwp_enqueue_styleを利用します。

使い方

<?php wp_enqueue_style( $handle, $src, $deps, $ver, $media ); ?>

パラメータ

$handle
(文字列) (必須) スタイルシートのハンドルとして使われる名称。特別なケースとして、文字列に ‘?’ という記号が含まれている場合、それより前の部分は登録されたハンドルとして参照され、それより後の部分はクエリストリングとして URL に追加される。
初期値: なし
$src
(文字列|真偽値) (オプション) スタイルシートの URL。例: http://example.com/css/mystyle.css。このパラメータは WordPress がこのスタイルを認識していない場合のみに必要。ローカルのスタイルには URL を直接書き込むべきではない。代わりに plugins_url (プラグイン向け) と get_template_directory_uri (テーマ向け) を使って適切な URL を取得する。リモートのアセットはプロトコルに影響されない URL で指定できる。例: //otherdomain.com/css/theirstyle.css
初期値: 空文字列
$deps
(array) (オプション) このスタイルシートが依存する他のスタイルシートのハンドル配列、つまり、このスタイルシートより前に読み込まれる必要があるスタイルシート。依存関係がない場合は空の配列を指定。
初期値: array()
$ver
(文字列|真偽値) (オプション) スタイルシートのバージョン番号を指定する文字列 (存在する場合) 。このパラメータはキャッシングに関わらず正しいバージョンがクライアントに送信されるようにするために使う。したがって、バージョン番号があってそれがスタイルシートに意味を持つ場合は含めるべきである。
初期値: false
$media
(文字列|真偽値) (オプション) スタイルシートが定義されているメディアを指定する文字列。例: ‘all’、’screen’、’handheld’、’print’。有効な CSS-media-types の全容についてはこちらの一覧を参照。
初期値: ‘all’

解説

まずは、対策前の状態でHTMLソースをみてみましょう。
wp_register_styleで追加されたcssは下記のようなHTMLになっていると思います

<link rel='stylesheet' id='style-css'  href='/load/view.php?a=aHR0cHM6Ly9jcmVhenkubmV0L3dwL3dwLWNvbnRlbnQvdGhlbWVzL2NyZWF6eS9zdHlsZS5jc3M/dmVyPTUuOQ' type='text/css' media='all' />

これは恐らくテーマの方で、WPのバージョンを自動でCSSのURLにパラメータとして追加し、キャッシュクリアを狙ったものと思います。
こんな感じで定義されているのではないでしょうか。

function theme_enqueue_styles() {
    global $wp_version;
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), $wp_version );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

wp_enqueue_styleの第4引数がパラメータになるので、そこにWPバージョンが指定されているのではないかと思います。
しかし、これはWP単位のバージョンなので、テーマのCSSを更新してもバージョンは上がらないため用途にはあいません。

そこで、テーマのバージョンをパラメータに使おうと下記のような例がでてくると思います。

function theme_enqueue_styles() {
    $my_theme = wp_get_theme();
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), $my_theme->get( 'Version' ) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

こうすると、style.cssの冒頭にコメントで定義するテーマバージョンを元にキャッシュクリアしますので、良さそうに思えます。
しかし、堕落したエンジニアの自分からするとテーマバージョンの書き換えを忘れそうだなと思ってしまいます。あとは、テーマのバージョン管理の方針として(特に開発中などは)軽微なCSS修正くらいではバージョン番号を上げたくないことも多いんです。

そこで、style.cssの最終更新日時をみて自動的にキャッシュクリアされるようにします。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

キャッシュクリア用の第4引数が date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) となっておりstyle.cssの物理パスを引数に filemtime 関数で更新日時を取得しています。これによってバージョン書き換えなどをしなくてもCSSの更新都度キャッシュがクリアされます。

<link rel='stylesheet' id='style-css'  href='/load/view.php?a=aHR0cHM6Ly9jcmVhenkubmV0L3dwL3dwLWNvbnRlbnQvdGhlbWVzL2NyZWF6eS9zdHlsZS5jc3M/dmVyPTIyMDEyNzA5MzAyNg' type='text/css' media='all' />

こういう感じで出力されます。

よくある間違い

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', date("ymdHis", filemtime( get_stylesheet_directory().'/style.css')) );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数にパラメータを指定したいのに、第3引数に何をいれたら良いかわからず無視してしまっている例。$depsを指定したくない場合は空の array() を入れる必要があります。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css?ver=20220128' );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数でパラメータを指定できるのに、URLに直接パラメータを追加している例。しかもベタ書き。
これをやってしまうと、CSSを更新するたびにfunctions.phpも更新しなければいけなくなるためよくありません。

function theme_enqueue_styles() {
    wp_enqueue_style( 'style', get_stylesheet_directory_uri() . '/style.css', array(), date("ymdHis") );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

↑第4引数でアクセスした日時をパラメータに渡し、完全にキャッシュクリアしている例。
この場合、キャッシュが完全にきかなくなってしまうので「開発中のみ指定して本番では変更してください」なんて書いている記事がありましたが、そんなの絶対忘れますからね。

§

というわけで、関数は正しく理解して使いましょう。

The post WordPressでstyle.cssを更新したらwp_enqueue_styleでキャッシュクリアする first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2022/01/wordpress-style-css-cache-clear.html/feed 0
Raspberry Pi 4 Model B 8GBでライブ配信(1) USB接続のWEBカメラ映像をFFmpegで保存してみる https://creazy.net/2022/01/raspberrypi4-webcamera.html https://creazy.net/2022/01/raspberrypi4-webcamera.html#respond Thu, 27 Jan 2022 10:39:53 +0000 https://creazy.net/?p=2836 ブログご無沙汰しております。ヤガーです。 本業のWEB開発と並行して、リモートワーク推奨の影響でライブ配信などの需要が高まっており、以前よりイベントなどで配信をしていた関係で様々な形式でのライブ配信方 ...

The post Raspberry Pi 4 Model B 8GBでライブ配信(1) USB接続のWEBカメラ映像をFFmpegで保存してみる first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

ブログご無沙汰しております。ヤガーです。

本業のWEB開発と並行して、リモートワーク推奨の影響でライブ配信などの需要が高まっており、以前よりイベントなどで配信をしていた関係で様々な形式でのライブ配信方法を検証していたりします。その中で観光地のライブカメラを検証する必要があったのですが、専用機種は数十万レベルの予算となりなかなか気軽に導入できるものではないため安い機材での自作ができないかと模索しておりました。VLOGなどの撮影用に購入したGoProに内蔵されているライブ配信機能にも期待して色々検証していたのですが、ライブカメラのように24時間365日稼働させるような安定感は出ないものと諦めました。今回は、廉価に手に入れられるRaspberry PiとWEBカメラの組み合わせでライブ配信の仕組みが構築できないか実験してみます。

実験手順を残していると結構文量が多くなるため、今回はとりあえずWEBカメラをつないで動画ファイルとしてローカル保存するまでをやってみます。

検証環境

– Raspberry Pi 4 Model B 8GB
– Raspberry Pi OS 64bit (Linux raspberrypi 5.10.92-v8+ #1514)
– ffmpeg version 4.3.3
– Logicool C270
– Logicool C920

直接関係ないですが、ホストマシンは

– Mac mini (M1, 2020)
– macOS Monterey 12.1

で操作しています。

かなり余談ですが、記事執筆時点で世界的なチップ不足により現在Raspberry Piの在庫もほとんど見つからないようです。本来は1万円くらいで購入できますが、Amazonなどで2〜3倍くらいに高騰している可能性がありますので気をつけてご購入ください。

Raspberry Pi 4のセットアップ

Raspberry Pi 4(以下、ラズパイ)にインストールするOSはRaspberry Pi OS 64bit(デスクトップ版)にしました。一度、何も考えずに32bitフルバージョンをインストールしたのですが、映像を扱う場合パフォーマンスを優先したいため64bit対応の方が望ましいと感じ再インストールしました。今どきは、Raspberry Pi Imagerを使って指定のOSイメージをmicroSDに書き込んでしまえば簡単に出来てしまいますね。というわけで詳細手順は省きます。

Raspberry Pi OS – Raspberry Pi

OSを入れ終わったらVNCとSSHでのアクセスを許可しておき、基本的にはMacからターミナルで接続して操作しました。

FFmpegのインストール

ラズパイからライブ配信をする場合、Windows/Macでも定番のフリーソフトOBSのLinux版が利用できます。
ダウンロード | OBS
・・・ですが、実際に試してみたところOBS自体の負荷が結構かかりそうなのでここでは紹介しないことにしました。

代わりに、動画変換ではド定番のFFmpegを利用します。
FFmpegの最新版を使いたい場合はソースからビルドする必要がありますが、とりあえずはaptで簡単にインストールしても十分だと思われます。

$ sudo apt-get install ffmpeg

FFmpegのバージョンを確認

$ ffmpeg -version
ffmpeg version 4.3.3-0+rpt2+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
configuration: --prefix=/usr --extra-version=0+rpt2+deb11u1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-mmal --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-sand --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100

4.3.3がインストールされました。

v4l2-ctlのインストール

今度はWEBカメラをUVC経由で確認したり、コントロールしたりするためにv4l2-ctlをインストールします。

$ sudo apt-get install v4l-utils

まずは接続中のUSBデバイス情報を確認します。

Logicool C270を接続して確認

$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12
	/dev/video18
	/dev/media2

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16
	/dev/video20
	/dev/video21
	/dev/video22
	/dev/video23
	/dev/media0
	/dev/media1

UVC Camera (046d:0825) (usb-0000:01:00.0-1.1):
	/dev/video0
	/dev/video1
	/dev/media3

余計な情報もありますが、UVCカメラとして認識されているC270と思われるものが/dev/video0,/dev/video1,/dev/media3と3種類でてきました。
デバイス名を指定してさらに詳細確認します。(–deviceを指定しなければ全件確認できますが長いので指定が無難)

$ v4l2-ctl --device /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'YUYV' (YUYV 4:2:2)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x120
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 176x144
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x176
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 432x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 544x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 752x416
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x448
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 864x480
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x544
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x720
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x576
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1184x656
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x960
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
	[1]: 'MJPG' (Motion-JPEG, compressed)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x120
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 176x144
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x176
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 432x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 544x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 752x416
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x448
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 864x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x544
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x576
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1184x656
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x960
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)

動画規格としては、YUYV 4:2:2Motion-JPEG, compressed、の2種類に対応しており、それぞれ解像度とフレームレートの組み合わせが用意されていることがわかる。
YUYV 4:2:2の方がRAW(映像ソースそのまま)なのでフレームレートが少ないんですね。

ちなみに、

$ v4l2-ctl --device /dev/video1 --list-formats-ext
$ v4l2-ctl --device /dev/media3 --list-formats-ext

とやっても結果を得られなかったので/dev/video0が正しいデバイス名だと分かる。

ちなみに、上記出力だと長過ぎて見にくいので、ffmpegと組み合わせると下記のようなコーデックと解像度だけを見やすく表示もできる。

$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0
(省略)
[video4linux2,v4l2 @ 0x557d3e8fa0] Raw       :     yuyv422 :           YUYV 4:2:2 : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360 752x416 800x448 800x600 864x480 960x544 960x720 1024x576 1184x656 1280x720 1280x960
[video4linux2,v4l2 @ 0x557d3e8fa0] Compressed:       mjpeg :          Motion-JPEG : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360 752x416 800x448 800x600 864x480 960x544 960x720 1024x576 1184x656 1280x720 1280x960

Logicool C920を接続して確認

続いて上位機種にあたるC920を接続して確認します。
※旧モデルなので、現在はC920nとして販売されているものが近いスペックかと思います。

$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12
	/dev/video18
	/dev/media2

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16
	/dev/video20
	/dev/video21
	/dev/video22
	/dev/video23
	/dev/media0
	/dev/media1

HD Pro Webcam C920 (usb-0000:01:00.0-1.1):
	/dev/video0
	/dev/video1
	/dev/media3

今度はちゃんとHD Pro Webcam C920として機種名が認識されています。
デバイス名を指定してさらに詳細確認します。(–deviceを指定しなければ全件確認できますが長いので指定が無難)

$ v4l2-ctl --device /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'YUYV' (YUYV 4:2:2)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x90
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x120
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 176x144
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 432x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x448
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 864x480
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x720
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x576
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1600x896
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 2304x1296
			Interval: Discrete 0.500s (2.000 fps)
		Size: Discrete 2304x1536
			Interval: Discrete 0.500s (2.000 fps)
	[1]: 'H264' (H.264, compressed)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x90
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x120
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 176x144
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 432x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x448
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 864x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x576
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1600x896
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
	[2]: 'MJPG' (Motion-JPEG, compressed)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x90
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 160x120
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 176x144
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 432x240
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x448
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 800x600
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 864x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 960x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1024x576
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1600x896
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 1920x1080
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.042s (24.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.133s (7.500 fps)
			Interval: Discrete 0.200s (5.000 fps)

動画規格としては、YUYV 4:2:2H.264, compressedMotion-JPEG, compressed、の3種類に対応しており、それぞれ解像度とフレームレートの組み合わせが用意されていることがわかる。上位機種なのでh264エンコードに対応しているということですね。(後に重要なポイントとなります。)

$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0
(省略)
[video4linux2,v4l2 @ 0x559ca32fa0] Raw       :     yuyv422 :           YUYV 4:2:2 : 640x480 160x90 160x120 176x144 320x180 320x240 352x288 432x240 640x360 800x448 800x600 864x480 960x720 1024x576 1280x720 1600x896 1920x1080 2304x1296 2304x1536
[video4linux2,v4l2 @ 0x559ca32fa0] Compressed:        h264 :                H.264 : 640x480 160x90 160x120 176x144 320x180 320x240 352x288 432x240 640x360 800x448 800x600 864x480 960x720 1024x576 1280x720 1600x896 1920x1080
[video4linux2,v4l2 @ 0x559ca32fa0] Compressed:       mjpeg :          Motion-JPEG : 640x480 160x90 160x120 176x144 320x180 320x240 352x288 432x240 640x360 800x448 800x600 864x480 960x720 1024x576 1280x720 1600x896 1920x1080

alsa, libasoundのインストール

ついでに、音声入力(マイク)も確認します。
音声の操作にはalsaを使いますがこれは ffmpeg のインストールの時に依存で勝手に入っています。
不足している libasound をインストールします。

$ sudo apt-get install libasound2-dev

音声デバイスを確認してみましょう。

$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 3: U0x46d0x825 [USB Device 0x46d:0x825], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

カード3、デバイス0、サブデバイス0なのでFFmpegから指定する場合 -i hw:3,0,0 と指定する。
※デバイス、サブデバイスは自動判別してくれるので -i hw:3 で十分と思われる。

FFmpegでWEBカメラをキャプチャ

それでは実際にffmpegコマンドを使ってWEBカメラの映像をキャプチャしてみましょう。

C270のYUYV 4:2:2ソースを保存

まずは、WEBカメラのRAWストリームをキャプチャし動画ファイルに保存します。保存する動画ファイルはh264のmp4ファイルにしてみましょう。

ffmpeg -y -hide_banner \
       -re -f alsa -thread_queue_size 16384 -ac 1 -channel_layout mono -ar 8000 -i hw:3,0,0 \
       -re -f v4l2 -thread_queue_size 16384 -input_format yuyv422 -video_size 1280x720 -framerate 5 -i /dev/video0  \
       -c:v libx264 -b:v 2M -vsync 1 -r 5 -g 10 -sc_threshold -1 -preset veryfast -s 1280x720 \
       -c:a aac -b:a 64k -ar 8000 \
       c270_yuyv422.mp4

-y 同じファイル名が合った場合は上書き
-hide_banner Configureなど多すぎる出力を制限
-f alsa 音声フォーマットにalsaを使う
-thread_queue_size 16384 バッファを指定
-ac 1 音声をモノラル(1)に指定(C270がモノラルだから)
-channel_layout mono 音声をモノラル(mono)に指定(C270がモノラルだから)
-ar 8000 音声サンプリングレートを8000Hzに指定。電話並の低品質(パフォーマンス優先のため)
-i hw:3,0,0 上述した音声デバイスの場所
-f v4l2 映像フォーマットをv4l2=video4linux2に指定(USBデバイスを使う)
-thread_queue_size 16384 バッファを指定
-input_format yuyv422 USBから取り出す映像コーデック
-video_size 1280x720 USBから取り出す映像サイズ
-framerate 5 USBから取り出す映像フレームレート
-i /dev/video0 映像デバイスの場所
-c:v libx264 映像コーデックを指定
-b:v 2M 映像ビットレートを指定
-vsync 1 映像同期設定。1で固定フレームレート
-r 5 フレームレートを指定
-g 10 GOPを指定
-sc_threshold -1 シーンチェンジ検出の閾値。-1は無効
-preset veryfast エンコードのスピードと圧縮率に影響するプリセット。veryfastがちょうど良さそう
-s 1280x720 映像の出力サイズ
-c:a aac 音声コーデック
-b:a 24k 音声ビットレート
-ar 8000 出力ファイルにも音声サンプリングレートを指定
c270_yuyv422.mp4 出力ファイル名

Input #0, alsa, from 'hw:3,0,0':
  Duration: N/A, start: 1643258247.558485, bitrate: 256 kb/s
    Stream #0:0: Audio: pcm_s16le, 16000 Hz, mono, s16, 256 kb/s
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 427283.462984, bitrate: 73728 kb/s
    Stream #1:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 73728 kb/s, 5 fps, 5 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #1:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
  Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[libx264 @ 0x55711cd650] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x55711cd650] profile High 4:2:2, level 3.1, 4:2:2, 8-bit
[libx264 @ 0x55711cd650] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=10 keyint_min=1 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=abr mbtree=1 bitrate=2000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'c270_yuyv422.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv422p(progressive), 1280x720, q=-1--1, 2000 kb/s, 5 fps, 10240 tbn, 5 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 16000 Hz, mono, fltp, 64 kb/s
    Metadata:
      encoder         : Lavc58.91.100 aac

映像ソースは非圧縮のyuyv422であるため、70Mbpsと結構重い印象。
とりあえず変換はできた。

変換中のCPU利用率は7〜8%

C270のMJPEGソースを保存

RAWソースは重すぎるので、次はMJPEGストリームをキャプチャし動画ファイルに保存します。保存する動画ファイルはh264のmp4ファイル。

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 1 -channel_layout mono -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format mjpeg -video_size 1280x720 -framerate 5 -i /dev/video0  \
       -c:v libx264 -b:v 2M -vsync 1 -r 5 -g 10 -sc_threshold -1 -preset veryfast -s 1280x720 \
       -c:a aac -b:a 64k -ar 48000 \
       c270_mjpeg.mp4

変更したオプションは、

-input_format mjpeg WEBカメラから取り出すフォーマットをMJPEGに変更
-ar 48000 音声サンプリングレートを入力ソースと同じ48000Hzに指定。8000とかだとエラーになったため

Input #0, alsa, from 'hw:3,0,0':
  Duration: N/A, start: 1643258564.375222, bitrate: 256 kb/s
    Stream #0:0: Audio: pcm_s16le, 16000 Hz, mono, s16, 256 kb/s
[mjpeg @ 0x5580884c30] unable to decode APP fields: Invalid data found when processing input
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 427600.276723, bitrate: N/A
    Stream #1:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 5 fps, 5 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #1:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
  Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[mjpeg @ 0x5580885070] unable to decode APP fields: Invalid data found when processing input
[libx264 @ 0x5580887800] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x5580887800] profile High 4:2:2, level 3.1, 4:2:2, 8-bit
[libx264 @ 0x5580887800] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=10 keyint_min=1 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=abr mbtree=1 bitrate=2000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
[aac @ 0x558088f910] Too many bits 8192.000000 > 6144 per frame requested, clamping to max
Output #0, mp4, to 'c270_mjpeg.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj422p(pc, progressive), 1280x720, q=-1--1, 2000 kb/s, 5 fps, 10240 tbn, 5 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 8000 Hz, mono, fltp, 48 kb/s
    Metadata:
      encoder         : Lavc58.91.100 aac
[mjpeg @ 0x5580885070] unable to decode APP fields: Invalid data found when processing input
    Last message repeated 1 times

unable to decode APP fields: Invalid data found when processing inputというエラーが出続けるのは気になりましたがファイル自体は保存できました。

変換中のCPU利用率は7〜8%

C270のMJPEG 30fpsを保存

MJPEGは30fpsまで取り出せるので実験してみる

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 1 -channel_layout mono -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format mjpeg -video_size 1280x720 -framerate 30 -i /dev/video0  \
       -c:v libx264 -b:v 2M -vsync 1 -r 30 -g 60 -sc_threshold -1 -preset veryfast -s 1280x720 \
       -c:a aac -b:a 64k -ar 48000 \
       c270_mjpeg_30fps.mp4

-input_format mjpeg WEBカメラから取り出すフォーマットをMJPEGに変更
-framerate 30 WEBカメラから取り出すフレームレートを30まで上げる
-r 30 フレームレートを指定
-g 60 GOPを指定

Input #0, alsa, from 'hw:3,0,0':
  Duration: N/A, start: 1643267484.662625, bitrate: 768 kb/s
    Stream #0:0: Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
[mjpeg @ 0x559ab55c30] unable to decode APP fields: Invalid data found when processing input
Input #1, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 436520.540001, bitrate: N/A
    Stream #1:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #1:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
  Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[mjpeg @ 0x559ab56070] unable to decode APP fields: Invalid data found when processing input
[libx264 @ 0x559ab58800] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x559ab58800] profile High 4:2:2, level 3.1, 4:2:2, 8-bit
[libx264 @ 0x559ab58800] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=60 keyint_min=6 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=abr mbtree=1 bitrate=2000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'c270_mjpeg_30fps.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj422p(pc, progressive), 1280x720, q=-1--1, 2000 kb/s, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 64 kb/s
    Metadata:
      encoder         : Lavc58.91.100 aac
[mjpeg @ 0x559ab56070] unable to decode APP fields: Invalid data found when processing input

やはりunable to decode APP fields: Invalid data found when processing inputというエラーが出ますが、30fpsで保存できたようです。

処理量が増えたためか、変換中のCPU利用率は23〜25%程度でした。

C920のYUYV 4:2:2ソースを保存

続いて、上位機種C920のRAWストリームをキャプチャし動画ファイルに保存します。保存する動画ファイルはh264のmp4ファイル 5fps。
※ここから、ffmpeg実行中のログ表示は省略します。

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 2 -channel_layout stereo -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format yuyv422 -video_size 1920x1080 -framerate 5 -i /dev/video0  \
       -c:v libx264 -b:v 3M -vsync 1 -r 5 -sc_threshold -1 -preset veryfast -s 1920x1080 \
       -c:a aac -b:a 64k -ar 48000 \
       c920_yuyv422.mp4

上位機種なので1080pに対応しているので1920×1080を取り出します。
また音声もステレオに対応しているので2チャンネル録音します。

-ac 2 音声をステレオ(2)に指定(C920がステレオだから)
-channel_layout stereo 音声をモノラル(stereo)に指定(C920がステレオだから)
-input_format yuyv422 USBから取り出す映像コーデック
-video_size 1920x1080 USBから取り出す映像サイズ
-s 1920x1080 映像の出力サイズ

映像ソースは非圧縮のyuyv422であるため、165Mbpsと結構重い印象。
とりあえず変換はできた。

変換中のCPU利用率は10%前後

C920のMJPEGソースを保存

続いて、上位機種C920のMJPEGストリームをキャプチャし動画ファイルに保存します。保存する動画ファイルはh264のmp4ファイル 30fps。

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 2 -channel_layout stereo -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format mjpeg -video_size 1920x1080 -framerate 30 -i /dev/video0  \
       -c:v libx264 -b:v 3M -vsync 1 -r 30 -sc_threshold -1 -preset veryfast -s 1920x1080 \
       -c:a aac -b:a 64k -ar 48000 \
       c920_mjpeg_30fps.mp4

-input_format mjpeg USBから取り出す映像コーデック
-framerate 30 WEBカメラから取り出すフレームレートを30まで上げる
-r 30 フレームレートを指定
-g 60 GOPを指定

CPU 37% 20fps speed=0.56x

MJPEGをFull HDで30fpsとなると流石に処理量が多いらしく、CPU高めでフレームも落としがちでした。

C920のH264ソースを保存

続いて、C920のH264ストリームをキャプチャし動画ファイルに保存します。圧縮率が高いので負荷が落ちることを期待しています。

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 2 -channel_layout stereo -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0  \
       -c:v libx264 -b:v 3M -vsync 1 -r 30 -sc_threshold -1 -preset veryfast -s 1920x1080 \
       -c:a aac -b:a 64k -ar 48000 \
       c920_h264_30fps.mp4

-input_format h264 USBから取り出す映像コーデック

CPU 27% 23fps speed=0.7x

やはりH264の方が軽量らしくMJPEGの時よりもCPU負荷が引くく、フレームレートも23と少し改善。ただし、やはり30フレームは取得できないんだなと。

H264を無変換で保存できるか

さて最後に少し実験です。
C920がH264ストリームをキャプチャできるということで、変換無しでそのままmp4ファイルに保存できないか試します。

ffmpeg -y -hide_banner \
       -f alsa -thread_queue_size 16384 -ac 2 -channel_layout stereo -ar 48000 -i hw:3,0,0 \
       -f v4l2 -thread_queue_size 16384 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video0  \
       -c:v copy -r 30 -s 1920x1080 \
       -c:a aac -b:a 64k -ar 48000 \
       c920_h264_copy.mp4

-c:v copy 変換しない場合はcopyを指定する

CPU 1.5% 15fps speed=1.0x

映像が無変換だからかほとんどCPUを消費せずに保存ができました。
しかし、30fps指定ですが処理的には15fpsしか取り出せていないようにみえるので、USBの処理が追いついていない?などちょっと不思議な挙動でした。

また、

[mp4 @ 0x5591fb1390] Non-monotonous DTS in output stream 0:0; previous: 0, current: -2560; changing to 1. This may result in incorrect timestamps in the output file.
[mp4 @ 0x5591fb1390] Non-monotonous DTS in output stream 0:0; previous: 1, current: -2069; changing to 2. This may result in incorrect timestamps in the output file.
[mp4 @ 0x5591fb1390] Non-monotonous DTS in output stream 0:0; previous: 2, current: -1516; changing to 3. This may result in incorrect timestamps in the output file.
[mp4 @ 0x5591fb1390] Non-monotonous DTS in output stream 0:0; previous: 3, current: -1024; changing to 4. This may result in incorrect timestamps in the output file.
[mp4 @ 0x5591fb1390] Non-monotonous DTS in output stream 0:0; previous: 4, current: -533; changing to 5. This may result in incorrect timestamps in the output file.

というエラーが出てしまったので、気になっていたのですが一応保存された動画ファイルは再生できたので深入りはしないでいますが、これの解消方法などご存知の方がいればコメントいただけると助かります。

まとめ

というわけで、とりあえずWEBカメラからの映像を動画ファイルに保存するというところまではできそうです。

一方、1080p 30fpsくらいの画質ですでにCPUを結構使ってしまっているので最後に実験したh264無変換にするなり画質を落とすなりしないと長時間の安定稼働はできない気がしています。

さて、長くなってしまったので一旦記事はここまでにしますが次回はさらにCPU負荷の改善のためにハードウェアエンコードを使った変換を試してみたいと思います。

ロジクール Webカメラ C270n ブラック HD 720P ウェブカム ストリーミング 小型 シンプル設計 ウェブカメラ 国内正規品 2年間メーカー保証
B07QMKND9M

ロジクール Webカメラ C920n ブラック フルHD 1080P ウェブカム ストリーミング 自動フォーカス ステレオマイク ウェブカメラ 国内正規品 2年間メーカー保証 ブラック
B07QQR6G5N

The post Raspberry Pi 4 Model B 8GBでライブ配信(1) USB接続のWEBカメラ映像をFFmpegで保存してみる first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2022/01/raspberrypi4-webcamera.html/feed 0
Clubhouseで自分の声をモニターできるMic Roomアプリ【追加機材なし】 https://creazy.net/2021/02/clubhouse-monitor-mic-room.html https://creazy.net/2021/02/clubhouse-monitor-mic-room.html#respond Wed, 03 Feb 2021 12:20:02 +0000 https://creazy.net/?p=2819 先週、Clubhouseを始めてから高音質化の調査を続けているので記事にまとめています。 ▶ Clubhouse高音質化計画/オーディオインターフェース経由でマイクを繋ぐ方法・BGMも流したいね! こ ...

The post Clubhouseで自分の声をモニターできるMic Roomアプリ【追加機材なし】 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

先週、Clubhouseを始めてから高音質化の調査を続けているので記事にまとめています。

▶ Clubhouse高音質化計画/オーディオインターフェース経由でマイクを繋ぐ方法・BGMも流したいね!

これらの調査をするなかで、非常に大きな課題だったのが、マイクから入れている自分の声や、タブレットなどから入力するBGMなどが実際どう聴こえているかを確認(モニター)できないという部分です。グループ音声通話のサービスなので、イヤホンには他の人の声が聴こえていて、自分の声は聴こえません。音声はともかくBGMは会話を邪魔しないくらいのボリュームに調整したいのでモニターしたいのです。

正攻法では、ヘッドフォンの前にもミキサーをはさんで、Clubhouseからの音声と自分側の音声をMIXして聴くことですが、機材は増えますし接続が複雑化するのでシンプルな方法がないかと思いましたがアプリで解決できました。

IK Multimedia Mic Room

‎Mic Room LE

現在、Clubhouse高音質化で一番使われているだろうiRig2などを開発しているIK Multimediaのマイクアプリです。これは、色々なマイクの音色を再現できるボーカル用の音楽アプリなのですが、入力している音声をモニターする機能があり、しかもそれをバックグラウンドで実行できる、つまりClubhouseでしゃべりながら実行できることがわかったのです。

こちら、無料版で目的は達成できました。

Mic Room LEの基本的な使い方

左上に「SOURCE」つまり入力マイクの選択があります。なにも接続していないと「built in mic」内蔵マイクになっていますが、Lightningなどで接続すると他の選択肢が選択されます。iRig製品の場合は対象のものが自動選択されるようです。

とりあえず、Apple純正のEarPodsで試しましたので「Apple Headset」を選びましたが、Lightning-ステレオミニピン変換などを挿した場合は「Other analog input」などにするとよいでしょう

右上の「MODEL」には往年の有名マイクを模したモデル名が並びますが、今回は音を変えたいわけではなくモニターしたいだけなので無視してよいです。課金すると色々なマイクが選べるようですが、デフォルトの「Dynamic 58」のままでよいです。

後は、下中央あたりに丸いノブがありますが、これでゲインを変更できます。ただ、これもそのままで良いです。

右下のINは他のアプリにバイパスする場合にONにしますが、ここも無視です。

では、右上のハンバーガーメニュー「三」みたいなボタンから設定に入りましょう。

Mic Room LEをバックグランドモニターするための設定

「Settings」に入ります。

上から、
Level : マイク入力音量
Out : モニター出力音量です。0のままで良いと思います
Input Channel : 入力チャンネルですが、4極ケーブルで接続しているとモノなので「MONO」で
Latency : 音の聞こえる時差は少ない方がいいので「ULTRA LOW」で
Auto Sleep : 「OFF」
Background Audio : バックグランド実行中にもMic Rooomからの出力をするかの選択肢で、ここを「ON」にすることでClubhouseと平行してモニターできます。

Clubhouseの音声に影響がないか

一つ心配だったのは、恐らく同様のモニター可能アプリで音声確認しながらClubhouseで話すと、プツプツと途切れるなどの報告がみられたのです。そこで、実際に音声テストROOMでたくさんの方が聴いている中テストしてみたのですが、見事モニターしながら、特に問題なくClubhouseへの入力もできました。

というわけで、音質にこだわり色々研究している人は、ぜひ自分の出力音のモニターにMic Room LEをご利用ください!

Clubhouseでは @yager.jp でアカウント作っていますのでよろしければフォローしてください!

【2021-02-05 追記】
IK Multimedia公式さまよりツイートをいただき、iRig Recorder LEでもモニターできることが分かりました。ただ、間違えて録音したりしないようにという意味でMic Roomの方が適切かもしれません。またまた偶然正解を引いたかも😓

The post Clubhouseで自分の声をモニターできるMic Roomアプリ【追加機材なし】 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2021/02/clubhouse-monitor-mic-room.html/feed 0
Clubhouse高音質化計画/オーディオインターフェース経由でマイクを繋ぐ方法・BGMも流したいね! https://creazy.net/2021/02/clubhouse_audio.html https://creazy.net/2021/02/clubhouse_audio.html#comments Sun, 31 Jan 2021 17:30:40 +0000 https://creazy.net/?p=2799 先週あたりから突然WEB界隈で流行りだした音声SNSのClubhouseがタイムラインであれよあれよと広がっていくので、流行り物好きとしては乗っかるしか無いと思ったんですが、いつも使っているyager ...

The post Clubhouse高音質化計画/オーディオインターフェース経由でマイクを繋ぐ方法・BGMも流したいね! first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
先週あたりから突然WEB界隈で流行りだした音声SNSのClubhouseがタイムラインであれよあれよと広がっていくので、流行り物好きとしては乗っかるしか無いと思ったんですが、いつも使っているyagerというアカウント名がすでに海外勢に取られており、しばらくすねてましたw。その後、運良く招待をいただきましたので遅まきながらやってみたわけです。

‎Clubhouse: Drop-in audio chat on the App Store

招待制ということもあって、なかなか入れない人がいたり、一方でかつてはこういう新サービスに奥手っぽかった有名人・芸能人もSNSリテラシーあがりまくりなので、がんがん参加してきていて久しぶりの新興サービス祭りを体験中です。

【2021/02/01 追記】
ネタフルさんがフォロー記事を書いてくださいました!
【Clubhouse】高音質を実現するためオーディオインターフェースをclubhouseでいろいろテストしてみた|ネタフル
【2021/02/02 追記】
UGREEN以外でも動作するオーディオ変換ケーブルがありましたので追記しました。

【検証環境】
iPhone 12 Pro
iOS 14.3
Clubhouse version 0.1.25

【キッカケ】音質が気になるガジェオタエンジニア

さて、サービスの立ち上がりや内容などは一通り情報が出回っているので他にゆずります。とりあえずネタフルさんの記事をリンクしておきます。
「Clubhouse」音声版TwitterのようなSNSサービスが界隈で話題!Inviteがメルカリで1万円で買われている|ネタフル

この手のサービスは「習うより慣れろ」ですので、いろんなROOMを回って聞いていたのですが、いまのところiOSアプリ限定のサービスということもあって、音質悪いなと思うことがありました。さらに、多くの人(とくに音楽に関わっている人)が高音質でやれたらいいのにという趣旨の発言をされており、このあたりはすぐに課題になるだろうと調査をはじめました。

Clubhouse高音質化計画

いかにMusic Mode(ミュージックモード)に切り替えるか

Clubhouseには画面上には一切設定がないものの、「Talk Mode(トークモード)」「Music Mode(ミュージックモード)」があります。通常はトークモードになっており、話し声が聞きやすいようにノイズカットやコンプレッサーのエフェクトがかかっているようです。しかし、もとの音声が十分高音質な場合はこのエフェクトのせいで音が劣化してしまいます。

iOS限定のアプリですので、iPhoneではLightning、iPad ProではUSB-Cなどでイヤホンマイクや3.5mm4極ステレオミニプラグ変換で外付けのオーディオ入力を検知すると、Music Modeに切り替えるか確認する緑のダイアログが表示されます。

これを「Yes, Music Mode」にするとエフェクトの影響のないミュージックモードになります。

もちろん、正しく音の設定が行われていればですが、通常のトークモードよりも音圧が高く聞きやすい音になるため、高音質化の最低条件と考えられます。Lightning-ステレオミニピン変換をしていても、4極でないものを接続していたり、必要なデータが届いていないとオーディオインターフェースとして認識されずMusic Modeにならない可能性があります。

また、Music Modeの切り替えは、Speaker中でも切り替え可能です。トーク中にオーディオIFを接続すればMusic Modeに、外せばトークモードに切り替えるダイアログがでます(現状どっちのモードかは画面から確認できないので、マイクを触ったりして音が反映されているかを確かめます)

効果を確認するために自分の音声をモニターしたい

追加機材なし、アプリで実現する方法が見つかりましたので別記事にしています。
Clubhouseで自分の声をモニターできるMic Roomアプリ【追加機材なし】 | Creazy!

アナログ方式での高音質化

iRigなどのモバイル対応オーディオインターフェースに注目

iOSでのオーディオ利用はあまり詳しくなかったのでiPhone+オーディオインターフェースで検索したところ大好きなネタフルさんの記事に行き着きました。

Clubhouseの音楽配信に「iRig 2」が使えることを確認|ネタフル

IK Multimedia iRig 2 ギター/ベース用モバイル・インターフェース【国内正規品】
B00UV71Y4I

IK MultimediaのiRigシリーズは以前にiRig Mic Lavを使っていたことがあるので馴染みがあります(すでに断線して廃棄済み)

ここで素人考えで、Lightning-オーディオジャックに変換してLINE入力できるようにできれば良いマイクが使えるのではと。ただ、ネタフルさんの記事で紹介されていたiRig2の用に、ヘッドフォンモニターができないとClubhouseのroomにいる他のスピーカーさんの声が聞けないなというのは理解できたので、マイク入力とヘッドフォン出力が両立する変換ケーブルを捜索

ポイントはオーディオ変換ケーブル(マイク入力とヘッドフォン出力を分岐)

そこで見つけたのがこちらUGREENの安い分岐ケーブル

UGREEN 3.5mm オーディオ変換ケーブル ステレオミニプラグ イヤホン ヘッドホン マイク 分配ケーブル 無酸素銅芯線 高音質 スマホ タブレット MP3/4 ノートパソコン PS4 Xbox one コントローラ等に対応 20cm …
B07MR5TPKV

998円で購入しましたが、2/1まではさらにセールで748円みたいです(セール終了済み)。そして手持ちの機材との組み合わせで苦労なくできてしまうという奇跡。
そのあたりは動画にまとめまして、ネタフルさんで記事にもしていただいたのでそちらでご確認ください。

【Clubhouse】iPhoneで高音質なマイクをオーディオインターフェース経由で繋ぐ方法|ネタフル

マイク → オーディオインターフェース → オーディオ分岐ケーブル → ステレオミニ・Lightning変換 → iPhone

の順でつなぎました。

注意点としては、どうやらiPhoneへの音声入力はかなりゲインを大きく取ってしまうようで、普段ZOOMや動画撮影などに使っている設定のままではiPhone側でクリップが発生しているのかとぎれとぎれになるケースがあり、ZOOM H5でLINE OUTを-20dbとかなり下げて出すように変更しました。このあたりはオーディオIFによっても異なると思うので調整が必要な範囲かと思います。

【その他の動作確認オーディオ変換ケーブル】

サンワサプライ変換アダプタケーブル(ヘッドホン+マイク用・3極-4極)KM-A25-005
B01BV916AQ

知っているメーカーだと安心します。私は573円で購入しましたが、安すぎてAmazonでは「あわせ買い対象商品」でした。

3.5mmアダプタケーブル Y分岐ジャックコネクタケーブル 3極メスx2-4極オス ゲーミングヘッドセット マイク変換用 Y分岐 ジャックコネクタケーブル イヤホン・マイク分配ケーブル コンポーネントケーブル. ゲーミングヘッドセット PS4 Xbox コントローラー ゲームパット Macbook iPhone スマホ 対応 (ブラック)
B086QVJPYQ

Amazon’s Choiceになっていた謎メーカーのもの。599円で購入しましたが普通に使えました。

音質については正直わかりませんでした。もしかしたら耐久性などで差がでてくるかもしれません。

4極(CTIA規格)の3.5mmステレオミニピン(オス) → 3極のマイク(LINE)入力(メス)、3極のヘッドフォン出力(メス)に分配するタイプであれば動作するものと思われます。役割としては既述のiRig2などと同じですが、iRigのメリットは本体でボリュームを調整できることですね。

テストroomで更に深堀り

さて、完全にラッキーパンチでできてしまったっぽいんですが、ネタフルさんとも相談してもうちょい実験するためにテストroomを立ち上げることに。

https://www.joinclubhouse.com/event/PGepnlGV
※イベントはすでに終了しています。

Clubhouse祭り中の奇跡として、著名なレゲエDJのRYO the SKYWALKER (@RYOtheSKYWALKER)さんから言及していただく。

そして、どさくさでテストroomにも誘ってみたら、参加してくださるなんて!
RYO the SKYWALKERさんつながりで、セレクターさんやミキサーさんなど、音のプロフェッショナルなかたにもSpeakerに参加してもらってアドバイスもらいつつ、以下のようなテストができました。短いですがコメント付きで紹介します。

①EarPodsをLightningで接続

EarPods → iPhone

[Good]
・Music Mode可
・シンプル
[Bad]
・音が小さい
・BGMなどの拡張性がない

最もシンプルな方法として、始めは古いiPhoneに付属していた標準のイヤフォンマイク「EarPods」でスタートしました。意外なことに、Lightning経由で接続しているからか「Music Mode」に切り替えるかのダイアログが表示され(恐らく)音が劣化しないミュージックモードで配信ができました。ただし、他の方の意見では音はクリアなもののボリュームが小さいとのこと、しかもボリュームをあげる方法がない(iPhone標準ではマイクボリュームのコントロールはない)のでちょっと物足りない感じに。

②オーディオ分岐ケーブル経由、オーディオインターフェース接続でコンデンサマイクを使う

marantz MPM-1000 → ZOOM H5 → UGREEN 分岐ケーブル → Lightning変換 → iPhone

[Good]
・Music Mode可
・コンデンサマイク可
・オーディオIFで音調整可能
[Bad]
・ここまででは特に問題がない

次にYouTubeで成功したパターンを再現してみました。予想通りみなさんから音質好評だったのですが、興奮してしまったのか少し大きめの声でしゃべるとクリップが発生するのかプチプチ音が切れる現象があり、オーディオIF側でゲインをさらにさげる調整をしてうまくいきました。

③オーディオ分岐ケーブル経由、オーディオインターフェース接続でダイナミックマイクを使う

Shure BETA58A → ZOOM H5 → UGREEN 分岐ケーブル → Lightning変換 → iPhone

[Good]
・Music Mode可
・ダイナミックマイクはコンデンサより低ノイズでさらに好評
・オーディオIFで音調整可能
[Bad]
・ここまででは特に問題がない

次に2の変化形でマイクをダイナミックマイクに変更しました。ZOOM H5はプリアンプもついているので問題ないだろうと思っていましたが案の定成功。Clubhouseの話とは直接関係ないと思いますが、コンデンサマイクとダイナミックマイクの特性により、ダイナミックマイクの方が万人に聞きやすそうという感想をいただきました。

④3にBGMやSEを加える

Fire HD →
Shure BETA58A → ZOOM H5 → UGREEN 分岐ケーブル → Lightning変換 → iPhone

[Good]
・Music Mode可
・ダイナミックマイクで音質良し
・タブレットからのBGM/SEも正常に入力できた
・オーディオIFで音調整可能
[Bad]
・タブレットからの音声はiPhoneからのオーディオ出力に含まれないのでボリュームのモニターができない

ZOOM H5には外付けのマイクカプセルにLINE入力することができるので、タブレット(今回はFire HDを利用)からポン出しアプリでBGM/SEを流してみました。トークメインのつもりだったので、BGMは小さめに、ピンポンやブッブーなどのSEは大きめの設定をして問題なさそうだったが、自分で音量をモニターできないので不安だった。

後になって気づきましたが、ZOOM H5にモニター用のヘッドフォンジャックがついてるので、別のイヤフォンでiPhoneに送り出す前の状態のマイク&BGMのモニターは可能ですね。

【追記】Clubhouseで自分の声をモニターできるMic Roomアプリ【追加機材なし】

⑤番外 AirPods

AirPods(Bluetooth) → iPhone

[Good]
・意外と音が良い
[Bad]
・音量調整不可
・Music Mode不可

自分は持っていないので試せていなかったのですが、他のスピーカーの方が使っていたので確かめられました。さすが、評判の良いAirPodsだけあってマイク音質も意外と良いと感じたのですが、Lightningで入力しているわけではないので、Music Modeには入れず音量最適化の影響がかかっていると思われます。

デジタル方式での高音質化

オーディオには大きくアナログ/デジタルの別があり、既述のようにステレオケーブルなどで接続する場合はアナログ方式、USBなどで接続する場合をデジタル方式と呼ぶようです。基本的には音の劣化のないデジタルの方がアナログよりも高音質です。

Clubhouseをデジタル方式で接続する場合、マイクとヘッドフォンの分岐は、ミキサーなどのルーティング機能により同じUSBケーブルから他の人の音声を受けつつ、自分のマイク(やBGM)音声を渡します。

現状、USB-C入力ができる iPad Pro → iRig Stream → ミキサーなどの組み合わせで成功しているとの情報があります。

他にもデジタル接続できるiRigシリーズのオーディオIFはありますが、自分以外にスピーカーが増えた場合にMusic Modeを抜けて内蔵マイクに変わってしまうなどの問題があるそうで成功組み合わせは限られているそうです。

確信の部分は有料ですが、田辺様のnoteに詳しい解説があります。
【独自検証】Clubhouseでオーディオ・インターフェースは使えるか?|田辺恵二(作編曲家)|note

IK Multimedia iRig Stream
B088QZQPM9

このジャンルは私が持っている機材に対象がないため、現状他のグループにお任せ状態です。
良い情報あったら追記します。

まとめ

最後に、Clubhouseを高音質化するためのTIPSをまとめます。

  • ポイントはいかに「Music Mode」に入るか
    • LightningなりUSB-C(iPad Pro)なりで有線接続した場合しか切り替わらない
    • 有線接続でも、ダイナミックマイクなどオーディオ入力をiPhoneが検知できない場合は切り替わらない
    • EarPodsなどオーディオIF通さないイヤホンマイクでもMusic Modeは可能。ただし、音量調整ができない
  • オーディオインターフェースを使う場合のポイントはマイク・ヘッドフォンの分岐
    • 録音だけでなく、他のスピーカーの声を聞かなければならずマイクとヘッドフォンの共存が条件
    • iRig2や本記事紹介のUGREEN分岐ケーブルなどアナログ的に解決するのが無難
    • マイク入力を分岐できれば音量の調整やBGMミックスなどはオーディオインターフェース(なりミキサー)でなんとでも

とりあえず、認識できているポイントはこのあたりです。
他のグループでも検証されている方がたくさんおり、「LightningよりUSB-C接続のiPad Proの方が音質が良い!」とか、「オーディオ分岐しても合うオーディオIFと合わないオーディオIF機器がある」など様々な情報が飛び交っておりますので、新しい情報が入りましたら随時更新したいと思います。

ちなみに、私は @yager.jp のアカウント名でおりますのでよろしければフォローしてください。
今後どのくらい参加するかは不明ですが・・・w

最近はブログよりYouTube頑張ってますので、よろしければチャンネル登録お願いしまーす!
https://bit.ly/YagerYouTube ←こちらから!

【リンク】音質やサービスに関する情報源

音声周りの技術的な観点に絞って、よい記事があったらリンクしていきます。

求人にメディアサーバ系がないので SaaS だろうと思った
利用しているリアルタイム配信サービスは Agora.io

via: Clubhouse リアルタイム配信の仕組みについて

インフラ気になりますよね。P2PとかでなくSaaSのサーバーを通しているだろうとのことでした。

周辺の技術者の間でおこなわれたパケット解析の結果や討議などを鑑みると、ClubhouseはUDPという、リアルタイム性が高く、データを垂れ流しする通信方式を利用して、通信をしていることが推測出来る。

当初、端末間を直接つなぐP2Pの仕組みでやり取りしていることが想定されていたが、パケット解析の結果、接続先がほとんど1カ所に集約されていることからこの考えは否定された。

via: Clubhouseが声被りしない理由。Zoomとの推定差異から考えてみた | Forbes JAPAN(フォーブス ジャパン)

ZOOMとの比較から、パケットの送り方など配信の仕組みについて分かりやすく考察しています。

Clubhouse – 西尾泰和のScrapbox
 →パケット解析組のまとめ

パケットの中身とサイズからすると、24KHz input, Opusの20ミリ秒delayでビットレートは32Kbps、モノラルに違いない!

via: voice_app_traffic_dived

僕らが耳で聞いているのは低ビットレートのモノラル音声だろう。そういう意味で、どんなに綺麗に入力してもたかがしれているとも言えそう。

clubhouseがマイクと認識する基準が争点となる。
マイク認識されない外部機材と認識される外部機材の差が不明瞭だが、信号が複雑なものは受け付けないような傾向がみられる。

via: 日本一早いClubhouseで使える機材検証速報(1/29昼)|巨万の富男【公式】┃standfm配信中|note

早い段階で、使えそうな機器の組み合わせをまとめている記事。iRig2推し

The post Clubhouse高音質化計画/オーディオインターフェース経由でマイクを繋ぐ方法・BGMも流したいね! first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2021/02/clubhouse_audio.html/feed 2
AmaQuick v5.0.0 ブックマークレット更新(PA-API v5対応など) https://creazy.net/2020/03/amaquick-v500-bookmarklet.html https://creazy.net/2020/03/amaquick-v500-bookmarklet.html#respond Sun, 08 Mar 2020 05:08:39 +0000 https://creazy.net/?p=2791 2019/09/09 – PA-API v5移行のご案内 (2020/3/9まで) Amazonより、AmaQuickでも利用しているアマゾンの商品情報を取得するAPI(PA-API)のバ ...

The post AmaQuick v5.0.0 ブックマークレット更新(PA-API v5対応など) first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

2019/09/09 – PA-API v5移行のご案内 (2020/3/9まで)

Amazonより、AmaQuickでも利用しているアマゾンの商品情報を取得するAPI(PA-API)のバージョンアップのアナウンスがあり、2020/3/9でバージョン4がシャットダウンされるとうことで、AmaQuickもバージョン5への移行を行いました。

基本的にはAPIの移行は内部で吸収し、AmaQuickの使い勝手は変わらないようにいたしました。また、久しぶりの更新ということもあり、要望として上がっていた機能も追加するなど非常に重要なアップデートとなります。

バージョンはPA-APIのバージョンに合わせてv5.0.0としています。

AmaQuick 公式ページ | Creazy!

PA-API v5に対応しました

内部で商品情報を取得しているAPIをバージョン5に移行しました。
これにより、内部ロジックが変更になっていますが、AmaQuickの使い勝手には基本的に影響しません。

§

PA-API v5への移行により、APIの実行回数制限がより厳密になりました。これまで、AmaQuickでは共通の認証情報を使いまわしキャッシュなどでAPIへのアクセス数を減らす努力をしていましたが、今回の変更でAPI実行エラーになる頻度が上がってしまう可能性がありました。

そこで、ユーザーには少し手間となりますがアソシエイトセントラルからご自身の認証情報を取得していただき設定できるようにしました。認証情報はセキュアなSSL通信でPOSTされ、AmaQuickシステムではPA-APIの認証の後、サーバに保持しませんので流出のリスクを最小限に抑えています。

AmaQuick 公式ページの「PA-API設定」を見る

これまでと同じように、ご自身の認証情報を登録せず、AmaQuick共通のままで利用することも可能です。利用制限回避のため、できるだけご自分の認証情報を使っていただけますと幸いです。

設定情報の保存場所をCookieからlocalStorageに変更

これまで、AmaQuickで使用する設定情報はブラウザのCookieに保存していましたが、より大きな容量を使用できるLocalStorageに保存先を変更いたしました。これにより度々レポートされていた、Cookieに起因する動作不具合が解消されます。(AmaQuickの設定がちゃんとロードされない。もしくは、Amazonの公式機能が動かないなど)

※はじめてv5.0.0を使う場合、localStorageに設定がなくCookieに設定がある場合は、自動でlocalStorageにデータ移行が行われます。

バックアップ/復元ができるようになりました。

これは非常に多くの要望をいただいていたのですが、設定をバックアップ・復元できるようにいたしました。

複雑なHTMLを組んだテンプレートを使用している場合、上記Cookieの問題や、PCを買い替えたなどで新しいブラウザを使う際に設定を入れ直すのが面倒だったのですが、設定をまるごとバックアップ・復元できるようになりました。

すべての設定項目を含むJSON文字列をテキストエディターなどで保管しておいていただくことになります。

AmaQuick 公式ページの「設定のバックアップ/復元」を見る

取得できなくなっていた「レビュー数」の取得を修正

Amazonの商品ページ構成変更により取得できなくなっていたレビュー数の取得が復旧いたしました。

§

非常に大規模なアップデートになりましたので、何か不具合見つかりましたらお知らせください。

♥よろしければ、カンパよろしくお願いします。
Amazonほしい物リスト

The post AmaQuick v5.0.0 ブックマークレット更新(PA-API v5対応など) first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2020/03/amaquick-v500-bookmarklet.html/feed 0
Macbook ProがUSB-Cになって古いUSB Type-AのLANアダプタ使うのにドライバ更新が必要だった話 https://creazy.net/2019/11/usb-c-mac-need-drivers-for-old-adaptors.html https://creazy.net/2019/11/usb-c-mac-need-drivers-for-old-adaptors.html#respond Tue, 19 Nov 2019 05:23:44 +0000 https://creazy.net/?p=2775 なんとかアウトプット増やさなきゃ〜と思っているヤガーです。 すっかりブログのペース落ちてしまっていますが、書ける時は小ネタでも書いて行こうと思います。 ボクの現在のメインマシンは「MacBook Pr ...

The post Macbook ProがUSB-Cになって古いUSB Type-AのLANアダプタ使うのにドライバ更新が必要だった話 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

なんとかアウトプット増やさなきゃ〜と思っているヤガーです。

すっかりブログのペース落ちてしまっていますが、書ける時は小ネタでも書いて行こうと思います。

ボクの現在のメインマシンは「MacBook Pro (15-inch, 2018)」で世の中の流行に従って、コネクタ類が全部USB Type Cに変わってきて、新たにアダプタ買わなきゃいけなかったりして面倒だったんですが、まあマルチ接続のものを1個買っとくと便利ですね。

HooToo USB C ハブ Type C macbook USB 3.0ポート*3 PD充電 HDMI 4Kビデオ SDカードリーダー Type-C ハブ MacBook/type-c パソコン 対応 HT-UC001 (グレー)
B07415KHK7

ボクが買ったのは↑これで、満足しているんですが、唯一LANアダプタがついていないので有線LAN接続するために前のMacbookで使っていたUSB3.0のLANアダプターを使いたかったんですが、うまくつながらなかったんです。

B00BJRU9IG

Rampow USB Type C to USB 3.0 変換アダプタ【2個セット/保証付き】MacBook Pro/Air/iPad Pro 2019/Surface/Sony Xperia/Samsung USB C to USB 3.1 Gen1 OTG対応 10Gbit/sの超高速データ転送 10000+回の抜き差しテスト 変換コネクタ
B0791YX2D1

こういう、純粋にUSB3.0→USB-Cに変換するのもあるので試したんですが駄目でした。
そういうものかと思って安いUSB-C→LANアダプターを購入して使ってました。

Cable Matters USB C LAN 変換アダプター USB Type C LAN有線アダプター USB3.1 Type C to RJ45 ギガビットイーサネット Thunderbolt 3対応 Macbook ProとDell XPS 13と15 などに対応 ブラック
B00X4S587K

まあ、そんなに高いものではないので問題ないんですが、アダプタ違うだけで使えないとかもったいないなぁ・・・と思っていたら

そうだ、ドライバ入ってないだけじゃね?

って最近気づきまして・・・

製品の型番LAN-GTJU3でググったららくらくドライバ見つかりまして
[[LAN-GTJU3]] – ドライバ & マニュアル(取扱説明書)ダウンロード – ロジテック

インストールしたらあっさりつながった😓

じゃあ買わなくて良かったじゃんと思いがちなんですが、まあ家用と外出用ができたと思ってラッキーと思っておきましょう。てか、なぜドライバの事思い出さなかったんだろw

The post Macbook ProがUSB-Cになって古いUSB Type-AのLANアダプタ使うのにドライバ更新が必要だった話 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2019/11/usb-c-mac-need-drivers-for-old-adaptors.html/feed 0
AmaQuick v3.1.3 ブックマークレット更新(楽天ISBN13対応、商品ID取得不具合解消など) https://creazy.net/2019/10/amaquick-v313-bookmarklet.html https://creazy.net/2019/10/amaquick-v313-bookmarklet.html#respond Thu, 03 Oct 2019 07:04:18 +0000 https://creazy.net/?p=2772 久しぶりにAmaQuickの更新を行いました。実はアナウンスなしで3.1.2として不具合解消対応も行っていたのですが合わせてご報告いたします。 AmaQuick 公式ページ | Creazy! 楽天キ ...

The post AmaQuick v3.1.3 ブックマークレット更新(楽天ISBN13対応、商品ID取得不具合解消など) first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>

久しぶりにAmaQuickの更新を行いました。実はアナウンスなしで3.1.2として不具合解消対応も行っていたのですが合わせてご報告いたします。
AmaQuick 公式ページ | Creazy!

楽天キーワード欄にセットされるISBN13桁からハイフン削除

Amazonで閲覧中の商品にISBN13が設定されている場合、楽天の検索が確実になるため「XXX-XXXXXXXXXX」のようなISBN13の値をセットしていましたが、ハイフンなしの数字13桁の方が楽天でヒット率がよい(中古品なども含め検索される)ため、そちらに変更しました。

Apple製品など一部商品でAmaQuickでエラー表示になる不具合解消

一部商品ページでAmaQuickブックマークレットを実行してもエラーになるケースがありましたが、修正を行いエラーが起きないようにいたしました。

§

アップデートできるタイミングがまちまちだったりしますが、なるべく使い続けられるようにしたいと思っておりますので、何か不具合見つかりましたらお知らせください。

♥よろしければ、カンパよろしくお願いします。
Amazonほしい物リスト

The post AmaQuick v3.1.3 ブックマークレット更新(楽天ISBN13対応、商品ID取得不具合解消など) first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2019/10/amaquick-v313-bookmarklet.html/feed 0
携帯電話キャリア・ドメイン一覧 https://creazy.net/2019/08/mobile-carrier-domains.html https://creazy.net/2019/08/mobile-carrier-domains.html#respond Mon, 19 Aug 2019 06:32:31 +0000 https://creazy.net/?p=2764 WEBサービス開発などで必要になったので、情報をまとめます。 今後もできるかぎり更新していきます。 メールのドメイン指定拒否・許可などでも参考にしてください。 携帯電話キャリア・ドメイン一覧 携帯電話 ...

The post 携帯電話キャリア・ドメイン一覧 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
WEBサービス開発などで必要になったので、情報をまとめます。
今後もできるかぎり更新していきます。

メールのドメイン指定拒否・許可などでも参考にしてください。

携帯電話キャリア・ドメイン一覧

携帯電話キャリア ドメイン
au ezweb.ne.jp
biz.ezweb.ne.jp
augps.ezweb.ne.jp
ido.ne.jp
uqmobile.jp
au.com
biz.au.com
NTTドコモ docomo.ne.jp
mopera.net
ソフトバンク disney.ne.jp
disneymobile.ne.jp
i.softbank.jp
softbank.ne.jp
vodafone.ne.jp
Y!mobile
(「PHS・旧ウィルコム」以外)
emnet.ne.jp
emobile.ne.jp
emobile-s.ne.jp
ymobile1.ne.jp
ymobile.ne.jp
yahoo.ne.jp
Y!mobile
(「PHS・旧ウィルコム」)
pdx.ne.jp
willcom.com
wcm.ne.jp
y-mobile.ne.jp
旧Jフォン jp-c.ne.jp
jp-d.ne.jp
jp-h.ne.jp
jp-k.ne.jp
jp-n.ne.jp
jp-q.ne.jp
jp-r.ne.jp
jp-s.ne.jp
jp-t.ne.jp
旧ツー カー sky.tkc.ne.jp
sky.tkk.ne.jp
sky.tu-ka.ne.jp

参考サイト

ご注意事項 | お知らせ | NTTドコモ

更新履歴

【2019/08/19】
リスト公開

The post 携帯電話キャリア・ドメイン一覧 first appeared on Creazy!.

Copyright © 2025 Creazy! All Rights Reserved.

]]>
https://creazy.net/2019/08/mobile-carrier-domains.html/feed 0