6

Windows Media Foundation API を使用して、マイクと使用可能なカメラの両方を列挙していますが、どちらも機能します。

ここに私の列挙コードがあります:

class deviceInput {
public:
    deviceInput( REFGUID source );
    ~deviceInput();

    int listDevices(bool refresh = false);
    IMFActivate *getDevice(unsigned int deviceId);
    const WCHAR *getDeviceName(unsigned int deviceId);

private:
    void Clear();
    HRESULT EnumerateDevices();

    UINT32      m_count;
    IMFActivate **m_devices;
    REFGUID     m_source;
};

deviceInput::deviceInput( REFGUID source )
    : m_devices( NULL )
    , m_count( 0 )
    , m_source( source )
{   }

deviceInput::~deviceInput()
{
    Clear();
}

int deviceInput::listDevices(bool refresh)
{
    if ( refresh || !m_devices ) {
        if ( FAILED(this->EnumerateDevices()) ) return -1;
    }
    return m_count;
}

IMFActivate *deviceInput::getDevice(unsigned int deviceId)
{
    if ( deviceId >= m_count ) return NULL;

    IMFActivate *device = m_devices[deviceId];
    device->AddRef();

    return device;
}

const WCHAR *deviceInput::getDeviceName(unsigned int deviceId)
{
    if ( deviceId >= m_count ) return NULL;

    HRESULT hr = S_OK;
    WCHAR *devName = NULL;
    UINT32 length;

    hr = m_devices[deviceId]->GetAllocatedString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &devName, &length );
    if ( FAILED(hr) ) return NULL;

    return devName;
}

void deviceInput::Clear()
{
    if ( m_devices ) {
        for (UINT32 i = 0; i < m_count; i++) SafeRelease( &m_devices[i] );
        CoTaskMemFree( m_devices );
    }
    m_devices = NULL;
    m_count = 0;
}

HRESULT deviceInput::EnumerateDevices()
{
    HRESULT hr = S_OK;
    IMFAttributes *pAttributes = NULL;

    Clear();

    hr = MFCreateAttributes(&pAttributes, 1);
    if ( SUCCEEDED(hr) ) hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, m_source );
    if ( SUCCEEDED(hr) ) hr = MFEnumDeviceSources( pAttributes, &m_devices, &m_count );

    SafeRelease( &pAttributes );

    return hr;
}

オーディオまたはカメラ キャプチャ デバイスを取得するには、 または と のいずれMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUIDかを指定MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUIDします。これは問題なく機能し、デバイスの名前と IMFActivate を取得できます。Web カメラを出力ビデオ ファイルに記録するコードはありますが、オーディオをファイルに記録する方法を理解するのに苦労しています。IMFSinkWriter を使用する必要があるという印象を受けましたが、オーディオ キャプチャ IMFActivate と IMFSinkWriter を使用する例が見つかりません。

私は Windows api プログラマーではないので、かなり単純な答えがあると確信していますが、COM のことは頭の中に少しあります。オーディオ形式に関しては、ファイルに含まれる限り、特に気にしません。wav、wma、または何でもかまいません。ビデオを録画していますが、ビデオ ファイルとオーディオ ファイルを別々にする必要があるため、ビデオ エンコーディングにオーディオを追加する方法がわかりません。

4

2 に答える 2

0

DirectShowオーディオ デバイスをファイルに記録する で DirectShow オーディオ キャプチャを管理するのに苦労しましたか?

Media Foundation を使用したキャプチャは、それほど簡単ではありません。一般に、DirectShow にはさらに多くのリソースがあることは言うまでもありません....

MSDN では、オーディオ キャプチャをファイルに実装するWavSink サンプルを提供しています。

Microsoft Media Foundation でカスタム メディア シンクを実装する方法を示します。このサンプルは、圧縮されていない PCM オーディオを .wav ファイルに書き込むアーカイブ シンクを実装しています。

彼らがこれを標準コンポーネントにしないことに決めた理由はわかりません。Media Foundation は多くの点で DirectShow よりも劣っていますが、少なくともこの小さなことを利点にすることができます。とにかく、サンプルがあり、良いスタートのようです。

于 2012-10-16T14:58:59.893 に答える