本文通过往cmd控制台输入命令的方式实现视频的录制,具体的命令可以参考文章https://blog.csdn.net/zhoubotong2012/article/details/79338093的前半部分
测试环境:
window 7 64位
vistual studio 2012
本文测试的Demo下载:https://gitee.com/zxy15914507674/shared_resource_name/blob/master/ffmpegDemo.rar
步骤:
1 下载ffmpeg.exe工具(一定要看准位数,本机测试下载的是64位的)
下载地址:http://www.ffmpeg.org/download.html
然后打开新的界面,如下图:
下载完毕后,找到里面的ffmpeg.exe工具
2 打开cmd窗口,并切换到ffmpeg.exe目录,查看计算机有哪些可用的视频采集设备和音频采集设备,输入命令:
ffmpeg -list_devices true -f dshow -i dummy
如下图:
3 查看视频采集设备支持的分辨率、帧率及像素格式等信息,
输入命令:ffmpeg -list_options true -f dshow -i video="HP HD Camera"
输入命令后,输出如下图:
4 合成视频的命令:
ffmpeg -f dshow -s 320*180 -i video="HP HD Camera" -f dshow -i audio="麦克风 (USB Microphone)" -vcodec mpeg4 -acodec aac -strict -2 myVideo.mp4
其中,HP HD Camera是我测试电脑的视频采集设备名称,麦克风 (USB Microphone) 是我测试电脑的声音采集设备的名称,mpeg4是视频编码格式(或填libx264),aac是声音编码格式,myVideo.mp4是录制完后的名称
输入该命令后,会在控制台输出录制的信息,输入q键结束录制
5 相关介绍已经介绍完毕,下面使用C#代码实现,采用winform,工程名称为ffmpegDemo
5.1 winform界面如下图:
5.2 把工具ffmepg.exe拷贝到bin/Debug目录下
5.3 新建一个名为ffmpegManager的类,用来处理视频录制的业务逻辑,编辑如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ffmpegDemo
{
public class ffmpegManager
{
Process p;
public ffmpegManager()
{
Init();
}
///
/// 初始化操作
///
private void Init() {
p = new Process();
//设置要启动的应用程序
p.StartInfo.FileName = "cmd.exe";
//是否使用操作系统shell启动
p.StartInfo.UseShellExecute = false;
// 接受来自调用程序的输入信息
p.StartInfo.RedirectStandardInput = true;
//输出信息
p.StartInfo.RedirectStandardOutput = true;
// 输出错误
p.StartInfo.RedirectStandardError = true;
//不显示程序窗口
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
//启动程序
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
}
///
/// 录制视频
///
/// 保存视频的名称
public void RecordVideo(string videoDeviceName,string audioDeviceName,string fileName) {
//可以根据需要修改命令中的参数
//完整命令:ffmpeg -f dshow -s 320*180 -i video="HP HD Camera" -f dshow -i audio="麦克风 (USB Microphone)" -vcodec mpeg4 -acodec aac -strict -2 myVideo.mp4
string command = "ffmpeg -f dshow -s 320*180 -i video=\""+videoDeviceName+"\" -f dshow -i audio=\""+audioDeviceName+"\" -vcodec mpeg4 -acodec aac -strict -2 "+fileName;
//向cmd窗口发送输入信息
p.StandardInput.WriteLine(command);
p.StandardInput.AutoFlush = true;
}
//停止录制
public void StopRecord() {
//输入q命令停止录制
p.StandardInput.WriteLine("q");
}
private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
Console.WriteLine(e.Data);
}
}
private void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
Console.WriteLine(e.Data);
}
}
}
}
5.3 在Form.cs中输入代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ffmpegDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//注册按钮点击事件
this.btnStartRecord.Click += new System.EventHandler(this.btnStartRecord_Click);
this.btnStopRecord.Click += new System.EventHandler(this.btnStopRecord_Click);
}
ffmpegManager manager;
private void btnStartRecord_Click(object sender, EventArgs e)
{
string fileName = this.textBox1.Text.Trim();
if (fileName.Length == 0)
{
MessageBox.Show("请输入文件名");
return;
}
manager = new ffmpegManager();
manager.RecordVideo("HP HD Camera", "麦克风 (USB Microphone)", fileName);
this.lblTipMessage.Text = "正在录制...";
//禁用录制按钮
this.btnStartRecord.Enabled = false;
//启用停止录制按钮
this.btnStopRecord.Enabled = true;
}
private void btnStopRecord_Click(object sender, EventArgs e)
{
manager.StopRecord();
this.lblTipMessage.Text = "";
//启用录制按钮
this.btnStartRecord.Enabled = true;
this.btnStopRecord.Enabled = false;
}
}
}
5.4 运行结果如下图(当然我这里项目属性设为控制台项目,所以就能看到对应的输出信息):
设置项目属性设为控制台项目只需要鼠标右键项目,然后选择属性,