不得不说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(, );
FreeConsole();
}
}
}

开始那几个api接口是用来模拟ctrl+c命令的。本来以为在停止录制的时候直接kill掉进程就好,结果导致生成的视频文件直接损坏了。手动使用ffmpeg.exe的时候发现ctrl+c可以直接结束录制并且不会损坏视频文件,于是采用这种方法,在点击停止按钮时模拟ctrl+c来退出ffmpeg。

ffmpeg的命令参数里,gdigrab是ffmpeg内置的屏幕录制设备,但是这个设备不能同时采集音频,于是又用到了后面的dshow。这里有个问题很奇怪,用ffmpeg获取音频设备列表时,设备的名称如果超过31个字符的话会被截断,而若是将完整的设备名传到参数里则无法进行音频采集,只能将截断的设备名称传进去,不知道为什么……

C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)的更多相关文章

  1. ASP.NET下调用ffmpeg与mencoder实现视频转换截屏

    最近要做一个视频播放的系统,用到了ffmpeg和mencoder两个工具,查了一些资料,发现这方面的资料还挺多的,但是就是乱了一点,我自己从头整理了一下,和大家分享一下: 1.ffmpeg实现视频(a ...

  2. 【Android Studio安装部署系列】二十六、Android studio录制屏幕并生成gif文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio自带录制屏幕功能,那么就可以很方便地将手机上的屏幕操作录制成视频.然后借助一些软件或者网站转换成gif文 ...

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

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

  4. [.NET]c#.net程序中使用ffmpeg.exe来处理视频并生成上传视频的截图

    添加如下前台代码: <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Butto ...

  5. NET 2.0(C#)调用ffmpeg处理视频的方法

    另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...

  6. ffmpeg命令 从网络摄像头录制视频

    安装 sudo apt-get install ffmpeg 录制视频为record.mp4文件 ffmpeg -y -i rtsp://cameral_ip:port -vcodec copy -a ...

  7. OpenCV Python 录制视频

    调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...

  8. Android adb录制视频和截屏的dos脚本

    以下是本人写的脚本,用于录制android手机视频.截屏 dos脚本文件名:screenrecord.bat @ECHO OFF CLS color 0a set SCREEN_RECORD_SAVE ...

  9. [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作

    [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作 转载请注明出处 一.关于为什么用pymediainfo以及pymediainfo的安装 使用python对视频/音频文件进行详 ...

随机推荐

  1. ansible - 基本用法

    目录 ansible - 01 一. 安装与使用 ansible命令格式 查看ansible生成的配置文件 ssh认证方式 ansible的第一个命令 弱口令校验 host-pattern的格式 模块 ...

  2. c# SQL事务

    SQL事务执行 SqlTransaction   sqlTransaction   =   sqlConnection.BeginTransaction();    SqlCommand   sqlC ...

  3. 【Codeforces 522A】Reposts

    [链接] 我是链接,点我呀:) [题意] 有人转载官方号的动态. 又有其他人转载其他人转载的动态. 问你最长的一条转载动态的链有多长. [题解] 用map把每个人的英文都转成小写的 然后从map中获取 ...

  4. BUPT2017 springtraining(16) #4 ——基础数论

    题目在这里 A.手动打表找规律得组合数 n -= 2, m -= 2, ans = C(n, m) #include <bits/stdc++.h> using namespace std ...

  5. Restful传递数组参数的两种方式

    第一种,直接传递数组 js直接传递数组 var data = ["123","456"];that.loadDictionarys(data).subscrib ...

  6. (39.3) Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在学习此小节之前您可能还需要学习: (39.1) Spring Boot Shiro权限管理[从零开始学Spring Boot] http://412887952-qq-com.iteye.com/b ...

  7. springCloud学习-服务消费者(rest+ribbon)

    1.ribbon简介 spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以 ...

  8. N天学习一个linux命令之df

    用途 查看系统硬盘空间使用情况 用法 df [OPTION]... [FILE]... 常用参数 -a, --all 显示所有文件系统,包含类似文件系统(dummy file system) -B, ...

  9. Clojure:ZeroMQ的入门DEMO

    假设你已经知道什么是ZeroMQ(不知道的话可以看这个:http://zh.wikipedia.org/wiki/%C3%98MQ),以下就给出在Clojure中如何使用ZeroMQ(感谢此文作者:h ...

  10. HDU 5434

    其实是一道状态DP题.都是行与行之间的转移,可以知道,当某j列中有一个象,如果存在情况i-1行j-1列有象而i,j-1位置无象则不可放,或者i-1,j+1有而i,j+1无同样不可放. 使用快速状态转移 ...