मैं अपने माइक्रोफ़ोन और उपलब्ध कैमरे दोनों की गणना करने के लिए विंडोज मीडिया नींव एपीआई का उपयोग कर रहा हूं, जो दोनों काम करते हैं।विंडोज मीडिया फाउंडेशन रिकॉर्डिंग ऑडियो
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। मेरे पास आउटपुट वीडियो फ़ाइल में वेबकैम रिकॉर्ड करने के लिए कोड है, हालांकि, मुझे फ़ाइल में ऑडियो रिकॉर्ड करने का तरीका पता लगाना मुश्किल समय है। मैं इस धारणा के तहत हूं कि मुझे IMFSinkWriter का उपयोग करने की आवश्यकता है, लेकिन मुझे कोई ऐसा उदाहरण नहीं मिल रहा है जो ऑडियो कैप्चर IMFActivate और IMFSinkWriter का उपयोग करता हो।
मैं विंडोज़ एपीआई प्रोग्रामर का अधिकतर नहीं हूं, इसलिए मुझे यकीन है कि काफी सीधे जवाब है, लेकिन COM सामान मेरे सिर पर थोड़ा सा है। जहां तक ऑडियो प्रारूप है, मुझे वास्तव में परवाह नहीं है, जब तक यह एक फ़ाइल में हो जाता है - WAV, WMA, या जो कुछ भी हो सकता है। भले ही मैं वीडियो रिकॉर्ड कर रहा हूं, मुझे वीडियो और ऑडियो फाइलों को अलग करने की ज़रूरत है, इसलिए मैं यह नहीं समझ सकता कि ऑडियो को मेरे वीडियो एन्कोडिंग में कैसे जोड़ा जाए।
यह लंबे समय से रहा है क्योंकि मैं उस परियोजना पर काम कर रहा हूं, और तब से इसे किसी अन्य व्यक्ति द्वारा लिया गया है जो इसे एक अलग दिशा में ले गया है। भले ही, उदाहरण कोड के साथ स्पष्ट उत्तर के लिए धन्यवाद, यह बहुत सराहना की है, और शायद किसी और को यह बहुत उपयोगी लगेगा :) – OzBarry