久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

<small id='ubj7l'></small><noframes id='ubj7l'>

  • <i id='ubj7l'><tr id='ubj7l'><dt id='ubj7l'><q id='ubj7l'><span id='ubj7l'><b id='ubj7l'><form id='ubj7l'><ins id='ubj7l'></ins><ul id='ubj7l'></ul><sub id='ubj7l'></sub></form><legend id='ubj7l'></legend><bdo id='ubj7l'><pre id='ubj7l'><center id='ubj7l'></center></pre></bdo></b><th id='ubj7l'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='ubj7l'><tfoot id='ubj7l'></tfoot><dl id='ubj7l'><fieldset id='ubj7l'></fieldset></dl></div>
      <bdo id='ubj7l'></bdo><ul id='ubj7l'></ul>
  • <tfoot id='ubj7l'></tfoot>
    <legend id='ubj7l'><style id='ubj7l'><dir id='ubj7l'><q id='ubj7l'></q></dir></style></legend>

        Windows Media Foundation 錄制音頻

        Windows Media Foundation recording audio(Windows Media Foundation 錄制音頻)

          • <bdo id='rgjii'></bdo><ul id='rgjii'></ul>
          • <tfoot id='rgjii'></tfoot>
              <tbody id='rgjii'></tbody>
          • <i id='rgjii'><tr id='rgjii'><dt id='rgjii'><q id='rgjii'><span id='rgjii'><b id='rgjii'><form id='rgjii'><ins id='rgjii'></ins><ul id='rgjii'></ul><sub id='rgjii'></sub></form><legend id='rgjii'></legend><bdo id='rgjii'><pre id='rgjii'><center id='rgjii'></center></pre></bdo></b><th id='rgjii'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='rgjii'><tfoot id='rgjii'></tfoot><dl id='rgjii'><fieldset id='rgjii'></fieldset></dl></div>

                • <small id='rgjii'></small><noframes id='rgjii'>

                  <legend id='rgjii'><style id='rgjii'><dir id='rgjii'><q id='rgjii'></q></dir></style></legend>

                  本文介紹了Windows Media Foundation 錄制音頻的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  我正在使用 windows media Foundation api 來枚舉我的麥克風和可用的攝像頭,它們都可以工作.

                  I'm using the windows media foundation api to enumerate both my microphones and available cameras, which both work.

                  這是我的枚舉代碼:

                  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_GUIDMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID 沒有問題,我可以抓取設備的名稱,以及IMF 激活.我有將網絡攝像頭錄制到輸出視頻文件的代碼,但是,我很難弄清楚如何將音頻錄制到文件中.我的印象是我需要使用 IMFSinkWriter,但我找不到任何使用音頻捕獲 IMFActivate 和 IMFSinkWriter 的示例.

                  To grab audio or camera capture devices, I specify either MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID or MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID and that works no problem, and I can grab the names of the devices, as well as the IMFActivate. I have code to record the webcam to an output video file, however, I'm having a tough time figuring out how to record the audio to a file. I'm under the impression that I need to use an IMFSinkWriter, but I can't find any examples that use an audio capture IMFActivate and IMFSinkWriter.

                  我不是一個 Windows api 程序員,所以我確信有一個相當直接的答案,但 COM 的東西只是有點超出我的頭腦.至于音頻格式,我并不在乎,只要它進入一個文件 - 可以是 wav、wma 或其他任何格式.即使我正在錄制視頻,我也需要將視頻和音頻文件分開,所以我無法弄清楚如何將音頻添加到我的視頻編碼中.

                  I'm not much of a windows api programmer, so I'm sure there's a fairly straight forward answer, but COM stuff is just a bit over my head. As far as audio format, I don't really care, as long as it gets into a file - can be wav, wma, or whatever. Even though I'm recording video, I need the video and audio files separate, so I can't just figure out how to add the audio into my video encoding.

                  推薦答案

                  對于遲到的回復,我深表歉意,我希望你仍然能發現這很有價值.我最近完成了一個與您類似的項目(將網絡攝像頭視頻與選定的麥克風一起錄制到帶有音頻的單個視頻文件中).關鍵是創建聚合媒體源.

                  I apologize for the late response, and I hope you can still find this valuable. I recently completed a project similar to yours (recording webcam video along with a selected microphone to a single video file with audio). The key is to creating an aggregate media source.

                  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd388085(v=vs.85).aspx
                  HRESULT CreateAggregateMediaSource(IMFMediaSource *videoSource,
                                                     IMFMediaSource *audioSource,
                                                     IMFMediaSource **aggregateSource)
                  {
                      *aggregateSource = nullptr;
                      IMFCollection *pCollection = nullptr;
                  
                      HRESULT hr = ::MFCreateCollection(&pCollection);
                  
                      if (S_OK == hr)
                          hr = pCollection->AddElement(videoSource);
                  
                      if (S_OK == hr)
                          hr = pCollection->AddElement(audioSource);
                  
                      if (S_OK == hr)
                          hr = ::MFCreateAggregateSource(pCollection, aggregateSource);
                  
                      SafeRelease(&pCollection);
                      return hr;
                  }
                  

                  在配置接收器編寫器時,您將添加 2 個流(一個用于音頻,一個用于視頻).當然,您還將為輸入流類型正確配置編寫器.

                  When configuring the sink writer, you will add 2 streams (one for audio and one for video). Of course, you will also configure the writer correctly for the input stream types.

                  HRESULT        hr                  = S_OK;
                  IMFMediaType  *videoInputType      = nullptr;
                  IMFMediaType  *videoOutputType     = nullptr;
                  DWORD          videoOutStreamIndex = 0u;
                  DWORD          audioOutStreamIndex = 0u;
                  IMFSinkWriter *writer              = nullptr;
                  
                  // [other create and configure writer]
                  
                  if (S_OK == hr))
                      hr = writer->AddStream(videoOutputType, &videoOutStreamIndex);    
                  
                  // [more configuration code]
                  
                  if (S_OK == hr)
                      hr = writer->AddStream(audioOutputType, &audioOutStreamIndex);
                  

                  然后在閱讀樣本時,您需要密切關注閱讀器streamIndex,并適當地將它們發送給編寫者.您還需要密切注意編解碼器期望的格式.比如IEEE float vs PCM等等.祝你好運,希望現在還不算太晚.

                  Then when reading the samples, you will need to pay close attention to the reader streamIndex, and sending them to the writer appropriately. You will also need to pay close attention to the format that the codec expects. For instance, IEEE float vs PCM, etc. Good luck, and I hope it is not too late.

                  這篇關于Windows Media Foundation 錄制音頻的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  In what ways do C++ exceptions slow down code when there are no exceptions thown?(當沒有異常時,C++ 異常會以何種方式減慢代碼速度?)
                  Why catch an exception as reference-to-const?(為什么要捕獲異常作為對 const 的引用?)
                  When and how should I use exception handling?(我應該何時以及如何使用異常處理?)
                  Scope of exception object in C++(C++中異常對象的范圍)
                  Catching exceptions from a constructor#39;s initializer list(從構造函數的初始化列表中捕獲異常)
                  Difference between C++03 throw() specifier C++11 noexcept(C++03 throw() 說明符 C++11 noexcept 之間的區別)

                  1. <legend id='PAEct'><style id='PAEct'><dir id='PAEct'><q id='PAEct'></q></dir></style></legend>
                  2. <small id='PAEct'></small><noframes id='PAEct'>

                    <tfoot id='PAEct'></tfoot>
                            <tbody id='PAEct'></tbody>
                          • <bdo id='PAEct'></bdo><ul id='PAEct'></ul>

                            <i id='PAEct'><tr id='PAEct'><dt id='PAEct'><q id='PAEct'><span id='PAEct'><b id='PAEct'><form id='PAEct'><ins id='PAEct'></ins><ul id='PAEct'></ul><sub id='PAEct'></sub></form><legend id='PAEct'></legend><bdo id='PAEct'><pre id='PAEct'><center id='PAEct'></center></pre></bdo></b><th id='PAEct'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='PAEct'><tfoot id='PAEct'></tfoot><dl id='PAEct'><fieldset id='PAEct'></fieldset></dl></div>

                            主站蜘蛛池模板: 在线免费播放av | 国产传媒在线 | 天天干夜夜骑 | 久久精品视 | 夜夜精品视频 | 麻豆精品久久 | 日韩一级黄色片 | 依人久久 | 免费的黄色大片 | 精品日韩一区二区三区 | 91蜜桃婷婷狠狠久久综合9色 | 亚洲欧美日韩一区二区三区四区 | 国产三级成人 | 欧美激情网站 | 亚洲欧美乱综合图片区小说区 | 黄色成人在线观看 | 综合色在线 | 精品黄色片| 欧美片网站yy | 国产一区二区日韩 | 亚洲性网站 | 国产二区精品 | 国产香蕉视频在线观看 | 亚洲专区一区 | 国产呦小j女精品视频 | 伊人2222| 在线性视频 | 久久精品欧美一区 | 欧美日韩在线看 | 18在线观看免费入口 | 一区二区三区视频在线播放 | 成人福利在线观看 | 黄色国产网站 | 精品一区在线 | 精品久久久久久 | 青娱乐av | 日韩一区二区在线播放 | 深夜福利影院 | 国产成人免费视频 | 午夜视频一区二区三区 | 久久日韩精品 |