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

news2024/9/22 17:25:09

本地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.coloradmin.cn/o/506141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac m2芯片 安装 brew 和cocoapods

Homebrew的安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 这里可能会失败&#xff0c;如 git clone 时候报错 error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly before end of the underlyi…

进程(二)

进程二 2.6 调度的概念、层次2.6.1 基本概念2.6.2 三个层次2.6.3 三层调度的联系、对比2.6.4 补充知识2.6.5 本小节总结 2.7 进程调度的时机、切换与过程、方式2.7.1 进程调度的时机2.7.2 切换与过程2.7.3 进程调度的方式2.7.4 总结 2.8 调度器/调度程序/闲逛线程2.9 调度算法的…

HTML5 + JavaScript绘柱状图

之前用HTML5 JavaScript绘柱状图&#xff0c;可以直观显示各类型产品或品牌的所占比例大小。详见&#xff1a; HTML5 JavaScript绘柱状图1 现在需要针对每年获得各类品牌数据进行对比&#xff0c;绘制柱状图会更直观。 首先我们定义二维数组aBrandType&#xff0c;存放品牌…

双指针的基本应用

一、环形链表 I 方法1:哈希表 struct hashTable {struct ListNode* key;UT_hash_handle hh; };struct hashTable* hashtable;struct hashTable* find(struct ListNode* ikey) {struct hashTable* tmp;HASH_FIND_PTR(hashtable, &ikey, tmp);return tmp; }void insert(struc…

页面一打开就有30个重复请求,优化方法

一、写在前面 上周测试同事给我提了个bug。他说在公司运营系统某个编辑页面中&#xff0c;一个post请求调用太多次了&#xff0c;想让我看看怎么回事。我刚听他讲这个事情时心里有点不屑一顾&#xff0c;觉得能有多少次啊&#xff0c;大惊小怪的。然而当我在测试环境中打开那个…

经典文献阅读之--A Lifelong Learning Approach to Mobile Robot Navigation(终生学习轨迹导航)

0. 简介 终生学习作为近年来比较火的一种深度学习方式&#xff0c;导航终身学习(LLfN)旨在解决标准导航问题的一种新变体&#xff0c;在该问题中&#xff0c;智能体在有限的内存预算下&#xff0c;通过学习提高在线经验或跨环境的导航性能。而最近有一篇文章《A Lifelong Lear…

Python数据分析实战【十四】:你知道python中有几种排序方法吗【文末源码地址】

文章目录 一、List.sort()排序案例一&#xff1a;按照列表中的元素进行排序案例二&#xff1a;按照销售额数据进行排列 二、sorted()排序案例一&#xff1a;sorted()对列表进行排序案例二&#xff1a;sorted()对字典进行排序案例三&#xff1a;sorted()对列表中的字典元素排序 …

[工具]Pytorch-lightning的使用

Pytorch-lightning的使用 Pytorch-lightning介绍Pytorch-lightning与Pytorch的区别Pytorch-lightning框架的优势Pytorch-lightning框架 重要资源 Pytorch-lightning介绍 这里介绍Pytorch_lighting框架. Pytorch-lightning与Pytorch的区别 Pytorch-lightning可以简单的看作是…

shiro反序列化[cve_2016_4437]

目录 什么是shiro&#xff1f; 漏洞原理 漏洞复现 修复方案 什么是shiro&#xff1f; Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 漏洞原理 Apache Shiro 1.2.4及以前版本…

D1. LuoTianyi and the Floating Islands (Easy Version)(树形dp)

Problem - D1 - Codeforces 这是问题的简化版本。唯一的区别在于在该版本中k≤min(n,3)。只有在两个版本的问题都解决后&#xff0c;才能进行黑客攻击。 琴音和漂浮的岛屿。 洛天依现在生活在一个有n个漂浮岛屿的世界里。这些漂浮岛屿由n−1个无向航线连接&#xff0c;任意两个…

【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

Python学习之Image模块图片滤镜效果操作示例

前言 滤镜效果是图像处理中常用的一种技术&#xff0c;可以用来增强图像的视觉效果&#xff0c;实现不同的效果&#xff0c;比如增强对比度、饱和度、色彩等。滤镜效果可以帮助用户快速地调整图像的特性&#xff0c;从而使图像更加适合用户的需求。 Image模块对于图像处理的…

Hive SQL 中 map, reduce 的数据血缘分析

Hive SQL 中的有些 SQL 语句和传统关系型数据库中使用的 SQL 语句在语法和功能上都有非常大的差异。在数据血缘分析中对这些 Hive SQL 特有的 SQL 语法的支持&#xff0c;是马哈鱼数据血缘关系分析工具和一般数据血缘分析工具的一个重要区别&#xff0c;对这些特殊 SQL 语法的支…

python代码大全

Python是一种高级编程语言&#xff0c;属于通用编程语言。它是由荷兰人Guido van Rossum在1989年创造的&#xff0c;其语法简单、易读易写&#xff0c;是一种解释型、面向对象、动态数据类型的编程语言&#xff0c;支持多种编程范式&#xff0c;如面向对象、函数式、过程化等。…

FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写)

FreeRTOS内核&#xff1a;详解队列管理FIFO 1. 背景2. Queue相关API2.1 xQueueCreate()&#xff1a;创建2.2 xQueueSend()&#xff1a;发送2.3 xQueueReceive()&#xff1a;接收2.4 vQueueDelete()&#xff1a;删除2.5 xQueuePeek() &#xff1a;不删除的方式从FIFO读数据&…

小程序技术给统一门户的建设带来新思路

统一门户的发展可以追溯到20世纪90年代初期&#xff0c;当时的企业和组织开始意识到信息技术可以用于整合和管理各种分散的应用程序和服务。随着互联网的普及和Web 2.0技术的兴起&#xff0c;统一门户的发展迅速加速。 在早期&#xff0c;统一门户主要采用定制化开发的方式实现…

Qt音视频开发45-音视频类结构体参数的设计

一、前言 视频监控内核组件重构和完善花了一年多时间&#xff0c;整个组件个人认为设计的最好的部分就是各种结构体参数的设计&#xff0c;而且分门别类&#xff0c;有枚举值&#xff0c;也有窗体相关的结构体参数&#xff0c;解码相关的结构体参数&#xff0c;同时将部分常用…

动态规划的学习

文章目录 动态规划的学习一、什么是动态规划&#xff1f;二、如何思考状态转移方程&#xff1f;三、动态规划的基本原理1.[509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)1.1 暴力递归解法&#xff1a;1.1.1 递归算法的时间复杂度那为什么时间复杂度会这么…

vcruntime140.dll丢失的解决方法分享,多种修复方式

随着最新版本的Windows 10操作系统推出&#xff0c;个人电脑的性能和功能得到了巨大提升。然而&#xff0c;尽管Microsoft已经不断更新固件和驱动程序&#xff0c;但仍然存在一些常见问题&#xff0c;例如“ vcruntime140.dll丢失 ”错误。这个错误可能会导致某些应用程序无法正…

三流面试聊技术,二流面试聊框架,一流面试…

前言 本文是为了帮大家快速回顾了软件测试中知识点&#xff0c;这套面试手册涵盖了诸多软件测试技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内用作面试复习&#xff0c;能达到事半功倍效果。 本来想将文件上传到github上&#xff0c;但由于文件太大有的都…