2020年5月30日土曜日

富山市特別定額給付金の申請をしました

富山市から特別定額給付金の申し込み書が届きました。例のコロナの10万円です。
代理申請などない場合は、簡単に記入できます。

必要なのは以下です
  • 身分証明書のコピー
  • 振込先口座の通帳などのコピー
  • 印鑑

書類はこんな感じの封筒で郵送で届きます。
皆さんのポストにもボチボチ投函されているんじゃないでしょうか

記入例も記載されているので特に悩む必要なさそうです。


通常の申請であれば、記入は赤枠の部分くらいです。
僕は印鑑押すの忘れました(笑
余計なチェックボックスに印入れないように注意です!




同封されている返信用の封筒をポストにポイで完了!

#富山市特別定額給付金 #10万円 #富山市特別定額給付金の申し込み方法

2020年5月22日金曜日

富山県のマスク購入券を使用しました。

富山県から配布されているマスク購入券でマスク買ってきました。
うちはAグループなので、ほかの方の参考に情報アップ


アルビスグループと大阪屋ショップで購入できます。
私が買ったのはアルビスです。

1箱2,200円(50枚)で2つまで購入できます。

1.購入方法

マスクは店頭に置いてあるのではなく、レジに置いてあります。
のこの表示のあるレジで、マスク購入券を渡すことで販売してもらえます。

クレジットカードでも購入可能です。

購入したマスクがこちら。
当然ながらMADE NI CHNA。コロナ以前からマスクは大抵、中国製です。
発売元はスタイルジャパンという会社でした。
ノーズフィットもついていて、ちゃんとしたマスクですよ。


で、買う必要あるのか?についてですが
ちなみに、店頭でもマスク5枚入りのものが普通に販売されていました。
値段も少し割高な程度です。
なので、マスク購入券でわざわざ買う必要もないかなと思いました。

そうは言いつつ、私は上限の2箱購入しました
今回は「マスク無くなるかもというヤキモキ感の解消」を目的として買ってみました。
これで、余計な心配しなくて良いという安心感を買った感じです。

今後警戒されている、コロナウィルスの第2波などのときに、少しでも心労が減るように、買い占めを起こさないためにも、今のうちにマスクを買うというのも選択肢かなと思います。

2.箱を開けてみました

2020/5/24追記
アクセス伸びているので、箱の表示と中のマスクも写真追加しました。





マスク購入券のマスクは、以前Vドラッグで購入した箱のマスクより少し分厚いような気がします。
少し硬いというか、しっかりしている感じです。
また、サイズ感は普通のマスクと同じで、成人男性が違和感なく装着できるサイズですよ。

2020年5月10日日曜日

Fresh! Online Photo Sessionに参加してみました

コロナ過の影響でモデルさんの撮影が出来なくなって久しい今日この頃。。。


兼ねてよりお世話になっていたFreshさんのオンライン撮影会に参加しました。
少し時間がかかったので、忘れないように覚書。
また、オンライン撮影会の「良い点」「良くない点」も感想として記載しました。

撮影会はZoomを利用したもので、パスマーケットでチケットを購入するスタイルです。
なので、
  • Zoomが動くPCやスマホ
  • パスマーケット(Yahoo)のアカウント
が必要になります。

注意が必要なのはパスマーケットのユーザ情報と、Zoomのアカウント名が一致している必要があること。
※パスマーケットでチケットに購入後は、ZOOM側のユーザ情報を変更する必要があると思います。

1.パスマーケットのユーザ情報の確認方法(チケット購入前)

パスマーケットのユーザ情報はログイン後に「My」と表示されている部分から「ユーザ情報編集」を選択することでユーザ情報を確認できます。


2.パスマーケットのユーザ情報の確認方法(チケット購入後)

チケット購入後にユーザ情報を変更しても、チケットには反映されないと思います。
その場合は、購入済みのチケットを確認すればOK

ログイン後に「My」と表示されている部分から「購入済みのチケット」を選択します。


購入済みのチケットの一覧が表示されます。
そのなかから、撮影会のチケットを選択します。

チケットの詳細が表示されます。(あまり内容変わらないけど)
ここの「チケットを表示する」をクリックします。

チケットの左下に購入者の名前が表示されます。



3.ZOOMのユーザ情報の確認方法

画面右上の「人型のシルエット」をクリックします。
または、https://zoom.us/profileへ移動します(事前にログインしておいてください)

プロフィールが表示され、ユーザ名が表示されます。
修正する場合は画面右側の「編集」をクリックします。

ユーザ名をチケット購入時のものに変更し「変更を保存」を選択します。

4.オンライン撮影会に参加した感想

撮影会はZOOMでのスクリーンショットの取得という形態になるため、通常の撮影会とは勝手が違います。
スタッフさんも手探りの状態と思うので、今後いろいろと改善されていくとは思います。
今回はFreshさんのオンラインセッション撮影会なので、個撮では雰囲気も変わってくると思います。

また、モデルさんもオンライン撮影会について模索中という印象を受けました。
撮影会としてのポージングをメインにするモデルさんもいれば、チャットを中心にするモデルさんもいて「どうやっていけばいいだろう?」ってみんな考えているところなんでしょうね。
僕は撮影会として参加したのでポージングしてほしい派ですが、会話を楽しみたいひともいるのもいるので、ケースバイケースなのでしょうね。

4.1.良い点

価格が安い
通常の撮影会に比べるとかなり安いです。

地方から参加できる
ネットでの参加のため、地方住みでも気軽に参加できます。
個人的には魅力的なことです。
逆に言えば「オンラインでも参加したくなるモデルさん」なら全国からの集客が見込めるのかな

自分のペースで会話できる
セッション形式の撮影会の場合、複数のカメラマンが参加しています。
モデルさんとの会話はチャットを使用します。
通常の撮影会だとあまり何もしゃべらないと「無言で撮ってて、気まずいかなぁ」と思うこともあるのですが、複数人が一斉に会話している状態なので無言でも目立たないと思います(笑
(そもそも、通常の撮影会で無言で撮り続けることが良くないとは思いますが・・・)
(5月10日追記)
現在は通常のセッションのように、順番でのマイク会話が可能となっているようです

並ばなくて良い
地味にすごいメリットだと思います。
通常のセッション撮影会は人気モデルさんはカメラマンの順番待ちの行列ができますが、ZOOMなので並ばなくてOK!
また、複数モデルさんを画面に小さく表示しておくこともできるので「撮りたい!」って思ったモデルさんに画面を切り替え撮影できます。

カメラ要らない
これって、メリットかなあ。。アイドルのファンの人は会話メインだろうし、カメラ持たずに参加できるってのはもしかしたらメリットなのかもしれない・・・

4.2.良くない点

画質が悪い
Zoomなので当然ですね。
一眼レフなどのカメラと比べると雲泥の差があります。
また、WEBカメラごとに画質が異なる場合、頑張ってポージングされていても画質が悪すぎて撮れないことがありました。。。この辺は時間とともに改善されていくと思います。

アングルの微調整ができない。
カメラは固定されているので、モデルさんに移動してもらうか、カメラ位置を変更してもらうことになります。
なので「もっと寄りたい!」とか「微調整したい!」ができません。
個撮であれば出来るのかな

めっちゃブレる
絞りもフラッシュも設定できないので、画面に写ったものを撮ることになります。
ある程度止まってポージングしてもらえると良いのですが、動きのある写真はブレちゃうので撮れません。
ライブ配信や自撮りを沢山しているモデルさんは、定期的に停止してくれるので撮りやすい感じがしました。


やはり、オンライン撮影会よりも、対面で行う撮影会のほうが魅力は感じます。
でも、今の時期を乗り越えるための代替手段としては、一つの選択肢としてアリなのかなと思いました。
撮影会が復活したあとも「オンライン用ブース」とか1つくらい出来たら、地方住みのカメラマンは少しうれしいかも♪

2020年5月8日金曜日

画面のハードコピーを保存する(Winshotの使い方)

WinshotはWindows用の無料の画面キャプチャソフトです。
画面のスクリーンショットは標準機能でも可能ですが、頻繁に使用するなら専用のアプリを使うことをオススメします。


まずは、Windowsデフォルトの機能についても紹介。

1.Windows標準機能で画面キャプチャする(画面全体)

画面全体をコピーする場合「PrintScreen」キーを押下します。
だいたい、イラストのあたりにあります。
キーボードによっては「PrtScr」など省略して書かれていることもあるみたいです。

コピーされた画像は、クリップボードにコピーされているのでペイントツールやWord、Excelに貼り付けることができます。
こんな感じで、画面全体がコピーされます。


2.Windows標準機能で画面キャプチャする(特定のウィンドウ全体)

特定のウィンドウのみをコピーする場合「Alt」キーと「PrintScreen」キーの2つを押下します。

コピーされた画像は、クリップボードにコピーされているのでペイントツールやWord、Excelに貼り付けることができます。
これはChromeのウィンドウをコピーした場合です。
こちらの方が使い勝手はいいですね。パソコンの操作手順書を作ったり、バグの報告エビデンス作成に使用することが多いのではないかと思います。


3.Winshotの機能でキャプチャする

Windows10ではデフォルトで出来る機能も多くなっているのでいつか不要になるのかもしれませんが、便利な機能を抜粋しておきます。
Winshotは起動するとシステムトレイ(ウィンドウの右下、時計の表示されているあたり)に常駐します。

右クリックで、様々なキャプチャ方法などを設定できます。

「JPEG保存」や「ビットマップ保存」を使用すると、自動で連番の画像として保存してくれます。
保存先の設定などは「環境設定」から行えます。
保存先を変更したり、ファイル名の指定などが可能です。
また「マウスカーソルをキャプチャする」のチェックをOFFにすることで、カーソルを非表示にしてキャプチャすることも可能です。


ホットキー設定を行えば、よく使う操作を「PrintScreen」キーなどに割り当てすることができます。

例えば、
操作手順書などを作成する場合
「クリップボードへコピー(矩形範囲指定)」をPrintScreenに割り当てることで、あとから不要部分のトリミングをする必要がなくなります。

オンライン撮影会やスクショを行う場合
「JPEGで保存(アクティブウィンドウ)」をPrintScreenに割り当てることで、押した瞬間の画像をJPEG保存でき、すぐに次の画像を取得できます。



一定時間ごとにキャプチャを撮りたい場合は「定期実行キャプチャ」も可能です。
あまり使い道は思いつきませんが・・・


キーボードのイラストはこちらのサイトのフリー素材を利用させていただきました。

2020年5月4日月曜日

ハニベ巌窟院

以前の写真ですが、写真の整理ができたので掲載します。

石川県小松市のハニベ巌窟院です。
秋にはWaiWai祭りというイベントで賑わいます。

地獄の描写などで有名な珍スポットとして有名ですが、世界の仏像などを模したものも多く、ライティングが良いのでカッコイイオブジェもあります。













屋外の写真は、TAMRON 17-35mm F/2.8-4 Di OSD
屋内の写真は、CANON EF50mm F1.8 STM,
だったと思います



[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
キヤノン EF50mm F1.8 STM
価格:14980円(税込、送料別) (2020/5/4時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
タムロン 17-35mm F/2.8-4 Di OSD ニコン用(Model A037)
価格:65127円(税込、送料別) (2020/5/4時点)

WPFでViewModelからWindowをCloseさせる

View層からのCloseは、this.Close()とかでOKだけど、WPFなのでViewModel層から画面を閉じたいことって結構あります。
今回は「Windowがアクティブじゃない場合」についても考慮しています。

1.引数としてWindowを受け取る

コマンドのバインド時にCommandParameterにWindowを渡します。
例)画面Load時のイベントにWindowを渡す場合

<i:Interaction.Triggers>
  <i:EventTrigger EventName="Loaded">
  <i:InvokeCommandAction
      Command="{Binding LoadedCommand}"
      CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
  </i:EventTrigger>
</i:Interaction.Triggers>


ViewModelは
private void Loaded(Window window)
{
  ・・・
  window.close()
}


のように画面を閉じることができます。
個人的にはViewModelでControl触るのはあまり好きじゃないなぁ

2.Closeメッセージを送る

こっちの方がMVVMぽいかな。Livetを使用しています。
XAML側にCLOSEメッセージ受信用のトリガーを書きます

<i:Interaction.Triggers>
  <l:InteractionMessageTrigger MessageKey="Close" Messenger="{Binding Messenger, Mode=OneWay}">
  <l:WindowInteractionMessageAction InvokeActionOnlyWhenWindowIsActive="False"/>
  </l:InteractionMessageTrigger>
</i:Interaction.Triggers>

private void Loaded(Window window)
{
  ・・・
  Messenger.Raise(new WindowActionMessage(WindowAction.Close, "Close"));
}
※メッセージを使用する場合、Windowがアクティブではない場合、デフォルトでは処理が動きません。
通常の「閉じるボタンクリック」などでは問題ないですが「処理が終わったら画面を閉じる」のような処理の場合は、Windowが前面に出ていない可能性が結構あると思います。
InvokeActionOnlyWhenWindowIsActive="False"
を設定することで、アクティブ状態でなくてもメッセージを受け取ることができます。

2020年5月3日日曜日

C#からFFmpegを制御する

前回、FFmpegからRtmp配信をする方法について記載しました。

コマンドプロンプトからFFmpegを使用しての動画の変換やダウンロードであれば、あまり気にする必要ないかもしれませんがWPFなどから起動する場合はProcessクラスを使用します。

1.プログラムからFFmpegを起動する

まずは基本形
public void RunFfmpeg()
{
    var proc = new Process();
    proc.StartInfo.FileName = "FFmpeg.exeのパス";
    proc.StartInfo.Arguments = "FFmpegのオプション指定";
    proc.StartInfo.CreateNoWindow = true; // ウィンドウ表示しない
    proc.StartInfo.UseShellExecute = false;
    proc.Start();
}

こんな感じ。
CreateNoWindow = true
を指定すると、ウィンドウが表示されません。

2.FFmpegを停止する

放っておいて停止するような場合は構いませんが、ライブ配信を行うような場合は、終了処理が必要となります。

public void RunFfmpeg()
{
    var proc = new Process();
    proc.StartInfo.FileName = "FFmpeg.exeのパス";
    proc.StartInfo.Arguments = "FFmpegのオプション指定";
    proc.StartInfo.RedirectStandardInput = true;
    proc.StartInfo.CreateNoWindow = true; // ウィンドウ表示しない
    proc.StartInfo.UseShellExecute = false;
    proc.Start();
}

今回はRedirectStandardInput = trueを指定しています。
これで、プロセスに対してコマンドの送付が可能となります。
FFmpegは「Q」キーで停止可能となっています。
なので、停止指示は「Q」を送付すればOK

public void StopFfmpeg()
{
    StreamWriter inputWriter = proc.StandardInput;
    inputWriter.WriteLine("q");
    rtmpProc.WaitForExit(3000);
}


3.標準入力を使用して入力データを送る

今度はWEBカメラからの映像の取り込み動画に変換します。

public void RunFfmpeg()
{
    var proc = new Process();
    proc.StartInfo.FileName = "FFmpeg.exeのパス";
    proc.StartInfo.Arguments = "-i - -f image2pipe output.mp4";
    proc.StartInfo.RedirectStandardInput = true;
    proc.StartInfo.CreateNoWindow = true; // ウィンドウ表示しない
    proc.StartInfo.UseShellExecute = false;
    proc.Start();

}

Arguments の「-i -」を指定することで、StandardInputからの入力を受け付けるようになります。
また、フォーマットでは「image2pipe 」を指定します。

次にカメラからの画像の取り込みについて。
こちらのサイトではWEBカメラを使用した画像の取り込みを行っています。
C#によるUSBカメラ操作(WPF編)

画像の取り込みには、Accord.Video.DirectShowのVideoCaptureDeviceを使用します。

public event NewFrameEventHandler NewFrameGot = delegate { };

public void StartCamera()
{
    var device = new VideoCaptureDevice("カメラ名");
    device.NewFrame += NewFrameGot;
    device.Start();
}

こんな感じで、NewFrameイベントを使用します。
// コンストラクタで指定
NewFrameGot += CamDeviceCtrlNewFrameGot;

private void CamDeviceCtrlNewFrameGot(object sender, NewFrameEventArgs eventArgs)
{
    eventArgs.Frame.Save(proc.StandardInput.BaseStream, ImageFormat.Bmp);
}

WPFで動画配信の再生(Vlc.DotNet.Wpf)

この記事ではRTMPの受信、再生をする方法として記載していますが、RTMPだけでなくHLSなどライブストリーム配信について同じ方法で対応可能かなと思います。


前回記事ではFFMpegを使用したRTMPの配信方法について記載しました。

WPFだろうが何だろうが、C#ではProcessとしてFFmpegを起動してあげれば配信可能なので、簡単かなと思います。

問題なのは再生の方かな。

1.再生用のWebページを作って、そのページをWPFで開く

サーバに配信用のPlayerとHTMLを置いて、そのページをWebBrowserコントロールで表示しようと思いました。
これなら、WPF側では制御いらないのでいいのかなと・・・

PlayerとしてはHTML5のvideoタグの利用をする方法と、FlowPlayerを利用する方法を試してみました。
WebBrowserコントロールはそのままではHTML5が表示できないので、レジストリを修正。
WPFのWebBrowserでHTML5を表示する

単体では動かせるけど、webBrowserコントロールで表示するとなると、動いてくれません。
やはり、javaやらflashなどを含めたページだから厳しいのかな・・・?

2.VlcControlの使用

結局うまくいったのは、Vlc.DotNet.Wpfを使用する方法です。

こちらのサイトを参考に導入しました。



必要なものは以下の4つ。
NuGetから取得できます。

  • VideoLAN.LibVLC.Windows
  • Vlc.DotNet.Core
  • Vlc.DotNet.Core.Interops
  • Vlc.DotNet.Wpf


VlcPlayerはXAMLのコードビハインドで以下のように書くだけ。

VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(Directory.GetCurrentDirectory(), "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));
string StreamParams = ":network-caching=2000";

var player = new VlcControl();
container.Content = player;
player.SourceProvider.CreatePlayer(VlcLibDirectory);
player.SourceProvider.MediaPlayer.Play(new Uri(RTMPのアドレス), StreamParams);

作成したVlcPlayerをContentControlなどのContentに入れてあげればOK。
導入は簡単だと思います。

残念な点があるとすれば、操作が基本的にXamlのコードビハインドになること。
そこで、ViewModelからバインドできるようにアレンジします。

3.VlcControlをViewModelから使用する

VlcContorlを操作するため、UserControlを作成し依存プロパティを追加します。

Xamlはこんな感じ。余計なものは省略しています。

VLCPlayer.xaml
<UserControl>
  <Grid>
    <ContentControl Name="PlayerContainer" />
  </Grid>
<UserControl>

で、UserControlのコードビハインド。
この例では依存プロパティとして「StreamPath」プロパティを追加しています。
StreamPathにViewModelからRTMPのパスを指定することで、再生先を切り替え出来ます。

VLCPlayer.xaml.cs

    public partial class VLCPlayer : UserControl
    {
        // Extra parameters to pass to the viewer media. I found a 2 seconds buffer cache makes playing much more stable.
        private const string StreamParams = ":network-caching=2000";

        public VlcControl vlcPlayer;
        VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(Directory.GetCurrentDirectory(), "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));

        #region StreamPath
        public static readonly DependencyProperty StreamPathProperty =
        DependencyProperty.Register("StreamPath",
                                    typeof(string),
                                    typeof(VLCPlayer),
                                    new FrameworkPropertyMetadata(string.Empty, new PropertyChangedCallback(OnStreamPathChanged)));

        public string StreamPath
        {
            get { return (string)GetValue(StreamPathProperty); }
            set { SetValue(StreamPathProperty, value); }
        }

        private static void OnStreamPathChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            VLCPlayer ctrl = obj as VLCPlayer;
            if (ctrl == null) return;

            ctrl.SetCamera();
        }
        #endregion


        public VLCPlayer()
  {
   InitializeComponent();
  }

        public void SetCamera()
        {
            if (vlcPlayer != null)
            {
                vlcPlayer.Dispose();
                vlcPlayer = null;
            }

            if (string.IsNullOrEmpty(this.StreamPath)) return;

            vlcPlayer = AddPlayer(this.StreamPath, PlayerContainer);
        }


        private VlcControl AddPlayer(string streamPath, ContentControl container)
        {
            var player = new VlcControl();

            container.Content = player;

            player.SourceProvider.CreatePlayer(VlcLibDirectory);
            player.SourceProvider.MediaPlayer.Play(new Uri(streamPath), StreamParams);

            return player;
        }

        private void UserControl_Unloaded(object sender, RoutedEventArgs e)
        {
            try
            {
                if (vlcPlayer != null)
                {
                    vlcPlayer.Dispose();
                    vlcPlayer = null;
                }
            }
            catch (Exception ex) { }
        }
    }



2020年5月2日土曜日

WPFで依存プロパティでエラーが発生する。(xdg0012 )

WPFでユーザコントロールに依存プロパティ(DependencyProperty)を追加しました。
追加方法がいろんなサイトで紹介されているので割愛。

下のように「IsMute」プロパティを追加したのですが、エラーになってしまいます。


xdg0012 ’IsMute’は認識されないかアクセスできません

症状は以下の感じ。

  • デザイナが表示されない
  • ビルドすると動作する
  • リビルドしても解消しない
  • VisualStudio2019で発生
依存プロパティは慣れていないとミスすることも多いと思うけど、どう書き換えてもエラーが消えない・・・


いろいろ試しましたが、結果的にVisualStudioの問題だったみたい。
更新すると発生しなくなりました。