不得不说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实现桌面录制(视频+音频+生成本地文件)【笔记】相关推荐

  1. C++ 调用 ffmpeg.exe 执行音视频混流合并;

    ffmpeg.exe文件可以去官网下载:FFmpeg 官网似乎不提供32位dll文件的下载了,但是可以下载exe文件来直接调用: #include <iostream> #include ...

  2. ffmpeg_拼接并提取flv视频文件中的音频生成mp3文件

    使用ffmpeg拼接多个 flv 视频并提取拼接好的 flv 文件的音频生成 mp3 文件 下一篇博文:ffmpeg_分割一个mp4文件到多个小的mp4文件 起因 下载了一个视频,网站上虽然是一整个, ...

  3. 【案例】FFMPEG GIF音乐搞笑视频自动生成 内含视频体验

    这项目灵感来自[案例]别人卖1000刀!一套油管自动生产视频赚钱方法详解,踩了很多坑额 ,因为发现不管是我做出来的视频还是别人做出来的,效果体验都不怎么样,很没意思,基本看到封面就没有点击的欲望(可能 ...

  4. win10录制视频+音频

    怎么说呢,不常录制视频,但是用一次,查一次,就很不开心. 1. win10自带录制视频 (1)快捷键 win+G,打开录制界面,打开设置 (2)在设置里修改音频捕获设置,选择所有 (3)点击录制按键, ...

  5. 【时序】WaveNet 音频生成模型论文笔记

    论文标题:WaveNet: A Generative Model for Raw Audio 论文下载:https://arxiv.org/abs/1609.03499 论文作者:Google Dee ...

  6. java调用ffmpeg,mencoder进行视频转换,读取时长等

    2019独角兽企业重金招聘Python工程师标准>>> 以前做的一个基于ffmpeg的视频格式转换的程序,现在抽空整理一下,很多地方都是从别的大神那借鉴的,只是把自己的觉得有用的,对 ...

  7. java 不等待 视频转码_java调用ffmpeg,mencoder进行视频转换,读取时长等

    以前做的一个基于ffmpeg的视频格式转换的程序,现在抽空整理一下,很多地方都是从别的大神那借鉴的,只是把自己的觉得有用的,对别人有帮助的拿出来分享分享,下面是代码 package video; im ...

  8. ffmpeg android屏幕录制视频,FFmpeg录制屏幕

    首先通过下面的命令查看一下 mac 上都有哪些设备. ffmpeg -f avfoundation -list_devices true -i "" 没有外界显示器的电脑中: 没有 ...

  9. java调用FFmpeg及mencoder转换视频为FLV并截图

    Conver.java package com.ll19.flv;public class Conver {public void run() {try {// 转换并截图String filePat ...

最新文章

  1. 如何给Apache添加虚拟路径和虚拟主机?
  2. 零基础AJAX入门(含Demo演示源文件)
  3. Vim YouCompleteMe 安装配置
  4. 计算机无法识别华为m3,华为8寸M3(非青春版)电脑连接问题报告
  5. 如何在Windows 7或Vista上安装IIS
  6. ThinkPHP Bootstrap简约自适应网址导航网站源码
  7. AndroidStudio_安卓原生开发_请求网络图片并解析成BitMap_异步处理_在UI线程执行_利用AsyncTask---Android原生开发工作笔记146
  8. WebLogic配置JNDI数据源
  9. error: invalid argument ‘-std=gnu++98‘ not allowed with ‘C‘
  10. 编译原理笔记05-语法分析自底向上
  11. 产品沉思录精选:如何像管理金融投资组合一样来管理知识?
  12. 爆款综艺也总火不过三季?谁来背锅?
  13. 编译原理|LL(1)语法分析实验
  14. 利用Python从数据分析的角度告诉你NBA2018-2019常规赛季为什么字母哥比哈登强?
  15. SimCSE 对比学习方法
  16. 【安全】被黑客要挟的一天,All your data is a backed up. You must pay 0.25BTC
  17. ios App加载网页,点击网页链接调用App处理
  18. 南京航空航天大学计算机组成原理,2017年南京航空航天大学计算机科学与技术学院829计算机专业基础之计算机组成原理考研题库...
  19. Gallery中,取消惯性滑动,滑动一次只切换一个视图
  20. AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

热门文章

  1. 常用运行命令win10
  2. 小米路由器的服务器无响应怎么回事,小米路由器常见问题与解决方法(高级功能)...
  3. NEXUS私服迁移内网(不能百度的那种)、NEXUS私服移植
  4. 侍魂哪个服务器人最多,为什么那么多人喜欢侍魂2,而我却觉得侍魂5比2好玩多了?...
  5. iOS 画图context/QuartzCore(相关函数的解释)
  6. latex中文编号是问号的问题
  7. 网络安全就业前景怎么样?好找工作吗?
  8. 脏读、重复读、幻读;
  9. AI领域:如何做优秀研究并写高水平论文?
  10. 钱塘湖春行 白居易 唐代