linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

2024-01-29 09:04

本文主要是介绍linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理

1 安装 scrcpy

地址 https://github.com/Genymobile/scrcpy
转到 relese 下载
我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz
下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1

解压scrcpy-2.3.1.tar.gz 到目录 scrcpy-2.3.1 安装:

./install_release.sh

打印 scrcpy 安装目录是 /usr/local/bin/scrcpy
scrcpy-server安装目录是 /usr/local/share/scrcpy/scrcpy-server

2 安装scrcpy-server

把 scrcpy-server-v2.3.1 复制到 路径 /usr/local/share/scrcpy/scrcpy-server

mv scrcpy-server-v2.3.1 /usr/local/share/scrcpy/scrcpy-server

3 手机打开wifi debug ,通过无线连接,保证电脑和手机在同一个局域网

连接方式有很多,可以通过有线方式,这里用无线方式举例
我的是华为手机,查看这篇文章 ADB无线调试——华为篇——鸿蒙系统 https://blog.csdn.net/ai_qh77/article/details/123383801

其它品牌手机自行查找方法

4 scrcpy 连接手机测试

wmx@wmx-ubuntu:~$ adb devices 
List of devices attached192.168.2.105:5555	device

说明我的手机已经 adb无线调试模式 连接到电脑
然后输入命令:

wmx@wmx-ubuntu:~$ scrcpy
scrcpy 2.3.1 <https://github.com/Genymobile/scrcpy>
INFO: ADB device found:
INFO:     --> (tcpip)  192.168.2.105:5555              device  NOH_AN01
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 0.6 MB/s (66007 bytes in 0.098s)
[server] INFO: Device: [HUAWEI] HUAWEI NOH-AN01 (Android 12)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6.0 NVIDIA 535.86.10
INFO: Trilinear filtering enabled
INFO: Texture: 1152x2376

可以看到手机已经投屏到ubuntu 电脑
在这里插入图片描述

这种方式 scrcpy 默认使用SDL渲染界面,如果我们想自己处理每一帧手机投屏的图像,接下来步骤5

5 通过 v4l2 方式,连接到linux电脑,然后Qt +ffmpeg 读取视频帧处理

参考 文章 https://github.com/Genymobile/scrcpy/blob/master/doc/v4l2.md

安装模块

sudo apt install v4l2loopback-dkms

查看设备

wmx@wmx-ubuntu:~$ v4l2-ctl --list-devices
aoni webcam A20: aoni webcam A2 (usb-0000:00:14.0-10.2):/dev/video0/dev/video1/dev/media0

创建v4l2设备

sudo modprobe v4l2loopback

再查看设备:

wmx@wmx-ubuntu:~$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):/dev/video2aoni webcam A20: aoni webcam A2 (usb-0000:00:14.0-10.2):/dev/video0/dev/video1/dev/media0

看到多一个 /dev/video2 ,这个就是我们通过代码读取的设备

scrcpy 通过 v4l2方式启动,关联/dev/video2

scrcpy --v4l2-sink=/dev/video2

6 QT +ffmpeg 读取设备 /dev/video2

我这已经提前安装好ffmpeg,配置好 linux 下 pkg-config

testVideo3.pro

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \ffmpegvideo.cpp \main.cpp \mainwindow.cppHEADERS += \ffmpegvideo.h \mainwindow.hFORMS += \mainwindow.uimessage("use system ffmpeg")
!android {unix:!macx {message(linux ffmpeg !!! )CONFIG += link_pkgconfig# PKGCONFIG += 库的pc文件名PKGCONFIG += libavcodec libavfilter libavformat libswscale libavutil libswresample  libavdevice  libpostproc}
}# Default rules for deployment.
DESTDIR = $$PWD/app

ffmpegvideo.h

#ifndef FFMPEGVIDEO_H
#define FFMPEGVIDEO_H#include <QImage>
#include <QWidget>
#include <QPaintEvent>
#include <QThread>
#include <QPainter>
#include <QDebug>#include <string>extern "C"{
#include <libavcodec/avcodec.h>
#include <libavdevice/avdevice.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/frame.h>
#include <libavutil/samplefmt.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#include <libavutil/parseutils.h>
#include <libavutil/mem.h>#include <libswscale/swscale.h>#include <libavformat/avformat.h>
}using namespace std;class FFmpegVideo : public QThread
{Q_OBJECT
public:explicit FFmpegVideo();~FFmpegVideo();void setUrl(QString url);bool open_input_file();protected:void run();signals:void sendQImage(QImage);private:AVFormatContext *fmtCtx       =NULL;const AVCodec         *videoCodec   =NULL;AVCodecContext  *videoCodecCtx=NULL;AVPacket        *pkt          = NULL;AVFrame         *yuvFrame     = NULL;AVFrame         *rgbFrame     = NULL;struct SwsContext *img_ctx=NULL;unsigned char *out_buffer=nullptr;int videoStreamIndex =-1;int numBytes = -1;QString _url;
};class FFmpegWidget : public QWidget
{Q_OBJECT
public:explicit FFmpegWidget(QWidget *parent = nullptr);~FFmpegWidget(

这篇关于linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656402

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解