最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)語音視頻錄制-附demo源碼

 更新時間:2015年08月21日 09:50:30   作者:zhuweisky  
在很多語言視頻軟件系統(tǒng)中,經(jīng)常有將實時的音頻或者是視頻錄制為文件保存到磁盤空間的需求,本篇給大家講C#實現(xiàn)語音視頻錄制-附demo源碼,感興趣的朋友一起來學(xué)習(xí)吧

在很多語音視頻軟件系統(tǒng)中,經(jīng)常有將實時的音頻或視頻錄制為文件保存到磁盤的需求,比如,視頻監(jiān)控系統(tǒng)中錄制監(jiān)控到的視頻、視頻會議系統(tǒng)中錄制整個會議的過程、語音通話系統(tǒng)中錄制完整的對話內(nèi)容、等等?!?/p>

MFile組件(Oraycn.MFile.dll)是傲瑞實用組件之一,它可以將原始的語音數(shù)據(jù)和視頻數(shù)據(jù)按照指定的格式進(jìn)行編碼,并將它們寫入到視頻文件(如.mp4)中。

一.緣起

      最近正在做的一個網(wǎng)絡(luò)招聘平臺的項目,其中有一個模塊是這樣的,應(yīng)聘者可以通過該系統(tǒng)的客戶端錄制自己的視頻(自我介紹)上傳到服務(wù)器,而后,招聘者會在合適的時候瀏覽這些應(yīng)聘者的視頻。該模塊涉及到的主要技術(shù)就是語音視頻錄制技術(shù),它需要把從麥克風(fēng)采集到的語音數(shù)據(jù)和從攝像頭采集到的視頻數(shù)據(jù)編碼并寫到.mp4文件中。

要完成這些功能,具體來說,需要解決如下幾個技術(shù)問題:

(1)麥克風(fēng)數(shù)據(jù)采集

(2)攝像頭數(shù)據(jù)采集

(3)音頻數(shù)據(jù)編碼

(4)視頻數(shù)據(jù)編碼

(5)將編碼后的數(shù)據(jù)按.mp4文件格式寫入到文件容器中。

(6)保證音頻視頻播放的同步。

二.Demo實現(xiàn)

      如果要從頭開始一步步解決這些問題,將是非常艱難的挑戰(zhàn)。幸運的是,我們可以通過已有組件的組合來實現(xiàn)這些功能,語音視頻數(shù)據(jù)的采集我們可以借助OMCS框架完成,后續(xù)的語音視頻編碼并生成mp4文件,我們可以借助MFile組件完成。為了更方便地講解,這里我們將給出一個具體的demo,它可以錄制從本地攝像頭和本地麥克風(fēng)采集的數(shù)據(jù)并生成mp4文件。demo運行的截圖如下所示:

     

      接下來,我們來說說在這個demo中是如何一個個解決上述問題的。

1.語音數(shù)據(jù)采集

      我們可以使用OMCS的MicrophoneConnector組件連接到自己的麥克風(fēng)設(shè)備,這樣,揚(yáng)聲器就會播放采集到的語音,而且,我們可以通過通過IMultimediaManager暴露的AudioPlayed事件,來捕獲正在播放的語音數(shù)據(jù)。

2.視頻數(shù)據(jù)采集

      同樣的,我們可以使用CameraConnector控件連接到自己的攝像頭設(shè)備,然后,定時器每隔100ms(假設(shè)幀頻為10fps)調(diào)用其GetCurrentImage方法獲得正在繪制的Bitmap。

3.后續(xù)步驟

       后續(xù)的4步都可以交由MFile組件搞定,我們大概看一下MFile組件中VideoFileMaker類的簽名,就知道怎么做了:

MFile 結(jié)構(gòu)

對于使用者而言,MFile組件中的主要類的結(jié)構(gòu)圖如下所示:

        其中,AudioFileMaker用于生成音頻文件、SilenceVideoFileMaker用于生成無聲的視頻文件、而VideoFileMaker用于生成既有聲音又有圖像的普通視頻文件。這三個類都從基類BaseMaker繼承,它們的使用方式也是一致的。接下來,我們僅僅詳細(xì)講解VideoFileMaker類的使用,SilenceVideoFileMaker 和 AudioFileMaker的使用方法可以類推之。

下面是VideoFileMaker類的public方法的簽名

代碼如下:

 public class VideoFileMaker :IDisposable
 {
  /// <summary>
  /// 初始化視頻文件。
   /// </summary>
  /// <param name="filePath">文件路徑</param>
  /// <param name="videoCodec">視頻編碼格式</param>
  /// <param name="videoWidth">視頻寬度</param>
  /// <param name="videoHeight">視頻高度</param>
  /// <param name="videoFrameRate">幀頻</param>
  /// <param name="audioCodec">音頻編碼格式</param>
  /// <param name="audioSampleRate">音頻采樣率。【注:采樣位數(shù)必須為16位】</param>
  /// <param name="audioChannelCount">聲道數(shù)</param>
  /// <param name="autoSyncToAudio">如果是實時錄制,則可傳入true,以音頻為基準(zhǔn)進(jìn)行同步。</param>
  void Initialize(string filePath, VideoCodecType videoCodec, int videoWidth, int videoHeight, int videoFrameRate, AudioCodecType audioCodec, 
      int audioSampleRate, int audioChannelCount, bool autoSyncToAudio);
  /// <summary>
  /// 添加音頻幀。
  /// </summary>  
  void AddAudioFrame(byte[] audioframe);
  /// <summary>
  /// 添加視頻幀。如果autoSyncToAudio開啟,則自動同步到音頻。
  /// </summary>  
  void AddVideoFrame(Bitmap frame);
  /// <summary>
  /// 添加視頻幀。
  /// </summary>
  /// <param name="frame">視頻幀</param>
  /// <param name="timeStamp">離開始時的時間長度</param>  
  void AddVideoFrame(Bitmap frame, TimeSpan timeStamp);
  /// <summary>
  /// 關(guān)閉視頻文件。
  /// </summary>
  /// <param name="waitFinished">如果還有幀等待寫入文件,是否等待它們?nèi)繉懭胛募?lt;/param>
  void Close(bool waitFinished);
 }

      首先調(diào)用Initialize方法完成初始化,然后,循環(huán)調(diào)用AddAudioFrame和AddVideoFrame方法,當(dāng)完成視頻錄制時,則調(diào)用Close方法,即可。很簡單,不是嗎?

4.主要代碼

      首先,我們以aa01用戶登錄到OMCS服務(wù)器,然后,在拖拽一個CameraConnector控件和一個MicrophoneConnector組件到主窗體上,然后,讓它們都連到自己的攝像頭和麥克風(fēng)。

this.multimediaManager = MultimediaManagerFactory.GetSingleton();   
 this.multimediaManager.Initialize("aa01", "", "127.0.0.1", 9900);
 this.cameraConnector1.BeginConnect("aa01");
 this.microphoneConnector1.BeginConnect("aa01");

       接下來,我們初始化VideoFileMaker組件:

 this.videoFileMaker.Initialize("test.mp4", VideoCodecType.H264, this.multimediaManager.CameraVideoSize.Width, this.multimediaManager.CameraVideoSize.Height, 10, AudioCodecType.AAC, 16000, 1, true);
 this.timer = new System.Threading.Timer(new System.Threading.TimerCallback(this.Callback), null ,0, 100);
 this.multimediaManager.AudioPlayed += new ESBasic.CbGeneric<byte[]>(multimediaManager_AudioPlayed); 

     參數(shù)中設(shè)定,使用h.264對視頻進(jìn)行編碼,使用aac對音頻進(jìn)行編碼,并生成mp4格式的文件。然后,我們可以通過OMCS獲取實時的音頻數(shù)據(jù)和視頻數(shù)據(jù),并將它們寫到文件中。

 void multimediaManager_AudioPlayed(byte[] audio)
 {
  this.videoFileMaker.AddAudioFrame(audio);
 }

 private void Callback(object state)
 {
  Bitmap bm = this.cameraConnector1.GetCurrentImage();
  this.videoFileMaker.AddVideoFrame(bm);
 }

      當(dāng)想結(jié)束錄制時,則調(diào)用Close方法:

this.videoFileMaker.Close(true); 

    這樣錄制生成的test.mp4文件就可以直接用我們的QQ影音或暴風(fēng)影音來播放了。

      更多細(xì)節(jié),請查看demo源碼。

三.Demo下載

點擊此處下載Demo源碼

2014.11.26 現(xiàn)在錄制本地的語音、視頻、屏幕的最好的方案是MCapture + MFile,而不是通過OMCS繞一大圈,相應(yīng)的Demo源碼下載:Oraycn.RecordDemo.rar 。

當(dāng)然,如果是遠(yuǎn)程錄制語音、視頻、屏幕,最好的方案是OMCS + MFile。

以上就是本文針對C#實現(xiàn)語音視頻錄制-附demo源碼的全部內(nèi)容,希望大家喜歡。

相關(guān)文章

  • C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲

    C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲

    這篇文章主要介紹了C#制作多線程處理強(qiáng)化版網(wǎng)絡(luò)爬蟲的相關(guān)代碼,有想學(xué)習(xí)C#多線程編程的小伙伴可以參考下
    2016-09-09
  • winform攔截關(guān)閉按鈕觸發(fā)的事件示例

    winform攔截關(guān)閉按鈕觸發(fā)的事件示例

    這篇文章主要介紹了c# winform攔截關(guān)閉按鈕觸發(fā)的事件示例,大家參考使用吧
    2014-01-01
  • C#使用LINQ查詢表達(dá)式的基本子句總結(jié)

    C#使用LINQ查詢表達(dá)式的基本子句總結(jié)

    這篇文章主要介紹了C#使用LINQ查詢表達(dá)式的基本子句總結(jié),在C#程序中我們可以使用LINQ基本查詢表達(dá)式模式來查詢和轉(zhuǎn)換SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集、XML文檔和流以及.NET集合中的數(shù)據(jù),需要的朋友可以參考下
    2016-03-03
  • C#中overrid和new修飾符有什么不同

    C#中overrid和new修飾符有什么不同

    在C#的繼承中嘗嘗會用到相關(guān)的修飾詞:override和new。這兩個修飾符都可以在新的子類中,重寫同名的父類方法。下面通過本文給大家介紹C#中overrid和new修飾符的區(qū)別,感興趣的朋友一起看看吧
    2018-02-02
  • c# 模擬線性回歸的示例

    c# 模擬線性回歸的示例

    這篇文章主要介紹了c# 模擬線性回歸的示例,幫助大家利用c#進(jìn)行機(jī)器學(xué)習(xí),感興趣的朋友可以了解下
    2020-10-10
  • C#實現(xiàn)快速查詢文件的方法

    C#實現(xiàn)快速查詢文件的方法

    這篇文章介紹了C#實現(xiàn)快速查詢文件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c# List find()方法返回值的問題說明(返回結(jié)果為對象的指針)

    c# List find()方法返回值的問題說明(返回結(jié)果為對象的指針)

    本篇文章主要介紹了c#中List find()方法返回值的問題說明(返回結(jié)果為對象的指針) 需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#遠(yuǎn)程發(fā)送和接收數(shù)據(jù)流生成圖片的方法

    C#遠(yuǎn)程發(fā)送和接收數(shù)據(jù)流生成圖片的方法

    這篇文章主要介紹了C#遠(yuǎn)程發(fā)送和接收數(shù)據(jù)流生成圖片的方法,涉及C#通過數(shù)據(jù)流傳輸圖片的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#中Timer定時器類的簡單使用

    C#中Timer定時器類的簡單使用

    定時器就是經(jīng)過固定時間,執(zhí)行固定任務(wù),本文主要介紹了C#中Timer定時器類的簡單使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C#事件中的兩個參數(shù)詳解(object sender,EventArgs e)

    C#事件中的兩個參數(shù)詳解(object sender,EventArgs e)

    這篇文章主要介紹了C#事件中的兩個參數(shù)詳解(object sender,EventArgs e),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

宁都县| 公主岭市| 洪江市| 额尔古纳市| 乌兰察布市| 云梦县| 库尔勒市| 宜兰县| 安庆市| 宜丰县| 临朐县| 外汇| 永登县| 莒南县| 东海县| 环江| 东光县| 华亭县| 大埔县| 鞍山市| 绥阳县| 文成县| 盐山县| 郁南县| 卢氏县| 雅安市| 松溪县| 洛扎县| 德兴市| 陕西省| 长兴县| 阳江市| 芷江| 桃园县| 尚志市| 梓潼县| 霍林郭勒市| 南充市| 九龙城区| 丁青县| 峨山|