C# 利用ffmpeg的image2pipe参数实现USB摄系头本地预览同时推流

news/2024/11/9 0:35:44/

本地USB摄像头在使用中时,不支持另一个程序的并发访问,也就是所USB摄像头只能令第一个连接的程序“独享”。

在开发一个软件时,希望实现预览USB摄像头的同时,实现摄像头的推流。

推流要用的ffmpeg,经过资料查找,ffmpeg支持通过管道传输给ffplay实现本地预览,代码如下:

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -f alsa -i hw:0 -c:v libx264 -preset ultrafast -tune zerolatency -b:v 1000k -minrate 500k -maxrate 2000k -bufsize 2000k -c:a aac -strict experimental -f flv rtmp://server/live/stream | ffplay -

用这个方法弹出的界面不美观,而且对系统资源占用非常高,不建议使用。

经过查询ffmpeg源码,发现有个image2pipe参数,可以完美实现这个需求,具体实现步骤如下:

  1. 项目中安装AForge用于对摄像头操作
  2. 设计界面如下
  3. 窗体载入
    // 获取摄像头设备
    //获取内置、外接摄像头,非网络摄像头
    videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    if (videoDevices.Count != 0)
    {foreach (FilterInfo device in videoDevices){cbo_camera.Items.Add(device.Name);}
    }
    else
    {cbo_camera.Items.Add("没有找到摄像头");
    }cbo_camera.SelectedIndex = 0;
  4. 选择摄像头
    private void cbo_camera_SelectedIndexChanged(object sender, EventArgs e)
    {if (videoDevices.Count != 0){//获取每个摄像头支持的分辨率videoDevice = new VideoCaptureDevice(videoDevices[cbo_camera.SelectedIndex].MonikerString);GetDeviceResolution(videoDevice);}
    }
  5. 获取分辨率
    /// <summary>
    /// 获取每个摄像头支持的分辨率
    /// </summary>
    /// <param name="videoCaptureDevice"></param>
    private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice)
    {cbo_rate.Items.Clear();videoCapabilities = videoCaptureDevice.VideoCapabilities;foreach (VideoCapabilities capabilty in videoCapabilities){cbo_rate.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");}cbo_rate.SelectedIndex = 0;
    }
  6. 摄像头有新帧进入的处理
    currentFrame = image;
    pictureBox1.Image = currentFrame;
    PushToRtmpServer(currentFrame);
    Console.WriteLine("NewFrame");
  7. 为AForge控件添加事件

  •  PushToRtmpServer代码
private void PushToRtmpServer(Bitmap frame)
{// 将摄像头视频推流到 RTMP 服务器if (ffmpegProcess == null || ffmpegProcess.HasExited){var outputSettings = $"rtmp://192.168.0.66/live/livestream?KeyCode=123";var ffmpegArgs = $"-y -f image2pipe -pix_fmt bgr24 -s {frame.Width}x{frame.Height}" +$" -r 25 -i - -c:v libx264 -preset fast -tune zerolatency -f flv {outputSettings}";var processStartInfo = new ProcessStartInfo("ffmpeg.exe"){RedirectStandardInput = true,UseShellExecute = false,CreateNoWindow = true,Arguments = ffmpegArgs,WindowStyle = ProcessWindowStyle.Hidden};ffmpegProcess = Process.Start(processStartInfo);}using (var ms = new MemoryStream()){this.Invoke((EventHandler)delegate {frame.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);ms.Seek(0, SeekOrigin.Begin);ffmpegProcess.StandardInput.BaseStream.Write(ms.ToArray(), 0, ms.ToArray().Length);});}
}

运行结果:

代码下载: https://download.csdn.net/download/dgnankai/87767380

 


http://www.ppmy.cn/news/83202.html

相关文章

回文子串问题

一&#xff1a;最长回文子串&#xff08;leetcode 5&#xff09; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#x…

RESTful:理解REST架构风格、RESTful API

一、REST架构风格 REST&#xff08;英文Representational State Transfer&#xff09;是一种基于客户端和服务器的架构风格&#xff0c;用于构建可伸缩、可维护的Web服务。REST的核心思想是&#xff0c;将Web应用程序的功能作为资源来表示&#xff0c;使用统一的标识符&#x…

【SQL】MySQL的查询语句

文章目录 SELECT语句WHERE子句JOIN语句GROUP BY和HAVINGORDER BYLIMIT其他关键字 MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;它被广泛地应用于各种应用程序和网站。学会使用MySQL的查询语句可以帮助我们更好地管理和分析数据&#xff0c;从而更好地利用数据库中的…

linux环境tomcat部署

若当前环境有tomcat进程&#xff0c;并且想替换掉&#xff1a; 要直接杀掉当前的 Tomcat 进程并替换为新的 Tomcat 包&#xff0c;可以按照以下步骤进行操作&#xff1a; 查找当前正在运行的 Tomcat 进程的进程 ID&#xff08;PID&#xff09;&#xff1a; # 使用 ps 命令查找…

typecho文档下的系统使用要求及文件结构说明

typecho是基于GNU General Public License 2.0开源协议。 系统优势&#xff1a; 轻量高效 数据库仅仅 7 张数据表&#xff0c;加上不足 400KB 的代码&#xff0c;就实现了完整的插件与模板机制。超低的 CPU 和内存使用率&#xff0c;足以发挥主机的最高性能。 先进稳定 原生…

Python 文件读取的练习

读取文本文件 给定一个名为 ‘example.txt’ 的文本文件&#xff0c;编写一段Python代码&#xff0c;读取文件并打印其内容。 行数统计 给定一个名为 ‘example.txt’ 的文本文件&#xff0c;编写一段Python代码&#xff0c;计算文件中的行数。 单词统计 给定一个名为 ‘exam…

一篇文章带你看懂5G网络(接入网+承载网+核心网)

通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧&#xff1a;手机或者集团客户通过基站…

C语言_数据类型[详细分析]

接上一篇&#xff1a;C语言_关键字_标识符简介 本次来分享C语言的数据类型&#xff0c;是博主的一些学习笔记的和心得的总结&#xff0c;话不多说&#xff0c;开始上菜&#xff1a; 此博主在CSDN发布的文章目录&#xff1a;我的CSDN目录&#xff0c;作为博主在CSDN上发布的文章…