使用ffmpeg调用摄像头录制视频(C#)

本文通过往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();
        }

        /// <summary>
        /// 初始化操作
        /// </summary>
        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();
        }
        /// <summary>
        /// 录制视频
        /// </summary>
        /// <param name="fileName">保存视频的名称</param>
       
        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 运行结果如下图(当然我这里项目属性设为控制台项目,所以就能看到对应的输出信息):

 

设置项目属性设为控制台项目只需要鼠标右键项目,然后选择属性,

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxy2847225301

测试使用

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值