

以前にTeraTailsのサイトに質問したのですが全く反応がないのでこちらに質問し直します。

C#で動画の制御をしたいと思いDirectShowとMediaFoundationを迷いましたが、MS的に後発であるし、.NETのライブラリがあると言う事でMediaFoundation.NETを使用することにしました。

<https://sourceforge.net/projects/mfnet/>

実際にはVS2017でNuGetのパッケージを入れております。

細かいところは省略しますが、動画再生に関する部分はほぼサンプル（MFSamples-2016-09）を使用しました。

厳密にやりたいのは動画の細かい制御（コマ送りだったり、再生スピード変更、二つの動画をそれぞれ再生位置を変更した後に同期再生・・等）ですが、とりあえずウィンドウ内のパネル等に動画を表示・再生・一時停止、TrackBarで再生位置を変更するような所までは出来るようになりました。

ですがいろんなサンプルを眺めたつもりなのですが音量操作の部分がどうしても分かりません。  
MediaSessionから作成するのは同じだと思うのですが、IMFSimpleAudioVolumeが分かりやすい名前でしたが、調べるとMSがこれをサンプルでも使用していないとかのディスカッションが見つかります。

結局王道としてどうして良いのかさっぱり分からない状況です。

正直音量は細かい操作は必要ないのでこんな所に時間がかかるとは思わず、結構萎えてきてしまってる状況です。  
（極端、元のボリュームとミュートが切り替えられるだけでも良いのですが、Windows自体のボリュームをミュートしてしまうのは不可なので）

サンプルがあれば一番良いですが、参考資料などございませんでしょうか？

よろしくお願い致します。

＝＝9月5日追記＝＝

コメント頂いたサイト（C++）を参考に

[code]

    object ppvObject;
    MFExtern.MFGetService(m_pSession, MFServices.MR_STREAM_VOLUME_SERVICE, typeof(IMFAudioStreamVolume).GUID, out ppvObject);
    m_pAudioStreemVolume = (IMFAudioStreamVolume)ppvObject;
    
[/code]

としてみたのですがm_pAudioStreemVolumeがnullになってしまいます・・・  
（正確にはppvObjectがnullで返ってきてます）

手探りでここまで来たんですが行き詰まってしまいました。  
何が間違っているのでしょうか・・・・  
動画再生や再生速度変更、再生位置変更等は問題ないので、後は音関係だけなのですが・・・  
海外サイトでも情報が少ないので結構キツイですね・・・・


CC BY-SA 4.0
2018-08-26T03:06:46.507
47814
2018-09-06T02:55:32.037
2018-09-05T11:16:36.113
3814
3814
question
c#
MediaFoundationでの音量操作


音量操作に使うのはIMFAudioStreamVolumeのようです。

C++での一連の記事があるようなので、参考にしてください。  
[MediaFoundationを使う 記事まとめ](https://www.timbreofprogram.info/blog/archives/461)

関連するところを抽出すれば、以下になるでしょう。

[MediaFoundationを使う (2)
MediaFoundation管理クラスの宣言](https://www.timbreofprogram.info/blog/archives/453)

> 使用するインターフェイスは？  
>  今回再生で使用するMediaFoundationのインターフェイスは以下の通りになります。  
>  インターフェイス名 役割  
>  IMFMediaSession メディア全体の状態を管理する。  
>  IMFByteStream MediaFoundation内でバイト単位のデータをやりとりするときに  
>  使うインターフェイス。  
>  IMFMediaSource メディアのソース部(ByteStreamも含む)を管理する  
>  IMFPresentationClock メディア再生時の基準時間の管理を行う。  
>  IMFVideoDisplayControl ビデオ状態の管理を行う。  
>  IMFAudioStreamVolume オーディオの音量管理を行う。

[MediaFoundationを使う (4)
MediaFoundation管理クラス実装その2](https://www.timbreofprogram.info/blog/archives/455)

> 音量系の処理  
>  //パンの変化を設定する  
>  BOOL CMFSession::SetPan(int nAbsolutePan)  
>  //音量の設定をする  
>  BOOL CMFSession::SetVolume(int nAbsoluteVolume)  
>  サポート関数のInnerSetVolumeに任せているだけなのでそちらでやります。

[MediaFoundationを使う (5)
MediaFoundation管理クラス実装その3](https://www.timbreofprogram.info/blog/archives/456)

> 内部音量設定  
>  //ボリュームを設定する  
>  HRESULT CMFSession::InnerSetVolume(void)


CC BY-SA 4.0
2018-08-26T09:30:23.143
47818
2018-08-26T09:30:23.143
26370
47814
answer


追記部分について

> としてみたのですがm_pAudioStreemVolumeがnullになってしまいます・・・

について、[`IMFAudioStreamVolume`](https://docs.microsoft.com/en-
us/windows/desktop/api/mfidl/nn-mfidl-imfaudiostreamvolume)には

> The streaming audio renderer (SAR) exposes this interface as a service. To
> get a pointer to the interface, call IMFGetService::GetService with the
> service identifier MR_STREAM_VOLUME_SERVICE.

と説明されていますから、`MFExtern.MFGetService()`の第一引数はstreaming audio renderer
(SAR)オブジェクトを渡す必要があります。


CC BY-SA 4.0
2018-09-06T02:55:32.037
48135
2018-09-06T02:55:32.037
4236
47814
answer