欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

C#調用FFMPEG實現桌面錄制(視頻+音頻+生成本地

系統 3081 0

不得不說FFMPEG真是個神奇的玩意,所接觸的部分不過萬一。網上有個很火的例子是c++方面的,當然這個功能還是用c++來實現比較妥當。

然而我不會c++

因為我的功能需求比較簡單,只要實現基本的錄制就可以了,其實就是一句命令的事

先來代碼:RecordHelper類

      
        using
      
      
         System;


      
      
        using
      
      
         System.Collections.Generic;


      
      
        using
      
      
         System.Diagnostics;


      
      
        using
      
      
         System.IO;


      
      
        using
      
      
         System.Linq;


      
      
        using
      
      
         System.Text;


      
      
        using
      
      
         System.Threading.Tasks;


      
      
        using
      
      
         Microsoft.DirectX;


      
      
        using
      
      
         Microsoft.DirectX.DirectSound;


      
      
        using
      
      
         System.Runtime.InteropServices;




      
      
        namespace
      
      
         ClassTool

{

    
      
      
        public
      
      
        class
      
      
         RecordHelper

    {

        
      
      
        #region
      
       模擬控制臺信號需要使用的api
      
        



        [DllImport(
      
      
        "
      
      
        kernel32.dll
      
      
        "
      
      
        )]

        
      
      
        static
      
      
        extern
      
      
        bool
      
       GenerateConsoleCtrlEvent(
      
        int
      
       dwCtrlEvent, 
      
        int
      
      
         dwProcessGroupId);



        [DllImport(
      
      
        "
      
      
        kernel32.dll
      
      
        "
      
      
        )]

        
      
      
        static
      
      
        extern
      
      
        bool
      
       SetConsoleCtrlHandler(IntPtr handlerRoutine, 
      
        bool
      
      
         add);



        [DllImport(
      
      
        "
      
      
        kernel32.dll
      
      
        "
      
      
        )]

        
      
      
        static
      
      
        extern
      
      
        bool
      
       AttachConsole(
      
        int
      
      
         dwProcessId);



        [DllImport(
      
      
        "
      
      
        kernel32.dll
      
      
        "
      
      
        )]

        
      
      
        static
      
      
        extern
      
      
        bool
      
      
         FreeConsole();



        
      
      
        #endregion
      
      
        //
      
      
         ffmpeg進程
      
      
        static
      
       Process p = 
      
        new
      
      
         Process();



        
      
      
        //
      
      
         ffmpeg.exe實體文件路徑
      
      
        static
      
      
        string
      
       ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + 
      
        "
      
      
        ffmpeg\\ffmpeg.exe
      
      
        "
      
      
        ;



        
      
      
        ///
      
      
        <summary>
      
      
        ///
      
      
         獲取聲音輸入設備列表

        
      
      
        ///
      
      
        </summary>
      
      
        ///
      
      
        <returns>
      
      
        聲音輸入設備列表
      
      
        </returns>
      
      
        public
      
      
        static
      
      
         CaptureDevicesCollection GetAudioList()

        {

            CaptureDevicesCollection collection 
      
      = 
      
        new
      
      
         CaptureDevicesCollection();



            
      
      
        return
      
      
         collection;

        }



        
      
      
        ///
      
      
        <summary>
      
      
        ///
      
      
         功能: 開始錄制

        
      
      
        ///
      
      
        </summary>
      
      
        public
      
      
        static
      
      
        void
      
       Start(
      
        string
      
       audioDevice, 
      
        string
      
      
         outFilePath)

        {

            
      
      
        if
      
      
         (File.Exists(outFilePath))

            {

                File.Delete(outFilePath);

            }



            
      
      
        /*
      
      
        轉碼,視頻錄制設備:gdigrab;錄制對象:桌面;

             * 音頻錄制方式:dshow;

             * 視頻編碼格式:h.264;
      
      
        */
      
      
        

            ProcessStartInfo startInfo 
      
      = 
      
        new
      
      
         ProcessStartInfo(ffmpegPath);

            startInfo.WindowStyle 
      
      =
      
         ProcessWindowStyle.Normal;

            startInfo.Arguments 
      
      = 
      
        "
      
      
        -f gdigrab -framerate 15 -i desktop -f dshow -i audio=\"
      
      
        "
      
       + audioDevice + 
      
        "
      
      
        \" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame \"
      
      
        "
      
       + outFilePath + 
      
        "
      
      
        \"
      
      
        "
      
      
        ;



            p.StartInfo 
      
      =
      
         startInfo;



            p.Start();

        }



        
      
      
        ///
      
      
        <summary>
      
      
        ///
      
      
         功能: 停止錄制

        
      
      
        ///
      
      
        </summary>
      
      
        public
      
      
        static
      
      
        void
      
      
         Stop()

        {

            AttachConsole(p.Id);

            SetConsoleCtrlHandler(IntPtr.Zero, 
      
      
        true
      
      
        );

            GenerateConsoleCtrlEvent(
      
      
        0
      
      , 
      
        0
      
      
        );

            FreeConsole();

        }
      
      
        

    }

}
      
    

開始那幾個api接口是用來模擬ctrl+c命令的。本來以為在停止錄制的時候直接kill掉進程就好,結果導致生成的視頻文件直接損壞了。手動使用ffmpeg.exe的時候發現ctrl+c可以直接結束錄制并且不會損壞視頻文件,于是采用這種方法,在點擊停止按鈕時模擬ctrl+c來退出ffmpeg。

ffmpeg的命令參數里,gdigrab是ffmpeg內置的屏幕錄制設備,但是這個設備不能同時采集音頻,于是又用到了后面的dshow。這里有個問題很奇怪,用ffmpeg獲取音頻設備列表時,設備的名稱如果超過31個字符的話會被截斷,而若是將完整的設備名傳到參數里則無法進行音頻采集,只能將截斷的設備名稱傳進去,不知道為什么……

C#調用FFMPEG實現桌面錄制(視頻+音頻+生成本地文件)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久人人爽人人爽 | 国产亚洲精品久久久久久久网站 | 久久综合狠狠色综合伊人 | 成人欧美在线观看 | 国产日韩精品一区 | 一区二区三区免费在线观看 | 欧洲精品色 | 欧美日韩一区在线观看 | 国产视频网站在线观看 | 国产高清美女一级a毛片久久 | 国产一区二区视频在线播放 | 亚洲精品日韩精品一区 | 日本三级韩国三级香港三级a级 | 免费无遮挡很爽很污很黄 | 免费看91 | 国产精品成人在线 | 日日摸夜夜爽日日摸视频 | A片扒开双腿猛进入免费观看 | 91精品视频免费在线观看 | 精品国产不卡一区二区三区 | 色播视频在线播放 | 成人伊人 | 日韩欧美一二三区 | asian极品呦女爱爱 | 国产亚洲精品久久久久久一区二区 | 欧美人成在线视频 | 99久久免费观看 | 大香伊人久久精品一区二区 | 天天干天天夜 | 日韩福利视频在线 | 小明永久免费 | 一级做a爰片性色毛片中国 日本黄色免费片 | 无码一区二区三区曰本A片 欧美综合激情网 | 欧美精品久久久久久久久老牛影院 | 91视频观看| 免费 视频 1级 | 九九热热九九 | 欧美精品免费在线 | 国产精品久久久久久搜索 | 日本捏胸摸下面免费视频 | 久久久久久九 |