在 alpine linux 中使用 webcam uvcdynctrl

apk add libxml2-dev libxml2 libxml2-utils libxml++-2.6-dev libjpeg-turbo-dev libturbojpeg-
apk add build-base git cmake autoconf automake libtool
wget -O libwebcam-src-0.2.5.tar.gz https://sourceforge.net/projects/libwebcam/files/source/libwebcam-src-0.2.5.tar.gz/download
tar xvzf libwebcam-src-0.2.5.tar.gz
cd libwebcam-0.2.5/
cmake .
make 
make install
uvcdynctrl -l

 apk add v4l-utils v4l-utils-dev  v4l-utils-libs qv4l2 libcamera-v4l2 

uvcdynctrl -d /dev/video0 -S 6:8  '(LE)0x50ff'
uvcdynctrl -d /dev/video0 -S 6:15 '(LE)0x00f6'
uvcdynctrl -d /dev/video0 -S 6:8  '(LE)0x2500'
uvcdynctrl -d /dev/video0 -S 6:8  '(LE)0x5ffe'
uvcdynctrl -d /dev/video0 -S 6:15 '(LE)0x0003'
uvcdynctrl -d /dev/video0 -S 6:15 '(LE)0x0002'
uvcdynctrl -d /dev/video0 -S 6:15 '(LE)0x0012'
uvcdynctrl -d /dev/video0 -S 6:15 '(LE)0x0004'
uvcdynctrl -d /dev/video0 -S 6:8  '(LE)0x76c3'
uvcdynctrl -d /dev/video0 -S 6:10 '(LE)0x0400'


安装成功后可以在bash下运行命令:uvcdynctrl -d /dev/video0 -S 6:10 '(LE)0x0400' 来控制该摄像头显示双摄像头数据


# uvcdynctrl -d /dev/video0 -c
[libwebcam] Invalid V4L2 control type encountered: ctrl_id = 0x00980001, name = 'User Controls', type = 6
[libwebcam] Invalid or unsupported V4L2 control encountered: ctrl_id = 0x00980001, name = 'User Controls'
Listing available controls for device /dev/video0:
  Brightness
  Contrast
  Saturation
  Hue
  White Balance, Automatic
  Gamma
  Power Line Frequency
  White Balance Temperature
  Sharpness
  Backlight Compensation

 uvcdynctrl -d /dev/video0 -s "Brightness" 128
uvcdynctrl -d /dev/video0 -s "Exposure, Auto" 1     # 关闭自动曝光
uvcdynctrl -d /dev/video0 -s "Exposure (Absolute)" 100

参考:
https://blog.51cto.com/u_15202985/6005161
https://www.cnblogs.com/astreye/p/8399792.html

PJLink-CSharp-连接投影机

控制类

using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class PJLinkController
{
    private readonly string _ipAddress;
    private readonly int _port = 4352; // PJLink 默认端口
    private readonly string _password = ""; // 如果投影机设置了密码,需在此填入

    public PJLinkController(string ipAddress, string password = "")
    {
        _ipAddress = ipAddress;
        _password = password;
    }

    // 连接投影机并执行命令
    private async Task<string> SendCommandAsync(string command)
    {
        using var client = new TcpClient();
        await client.ConnectAsync(_ipAddress, _port);
        
        using var stream = client.GetStream();
        var buffer = new byte[1024];
        
        // 读取欢迎消息
        var bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
        var welcomeMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        
        // 验证是否需要密码
        string authString = "";
        if (welcomeMessage.Contains("%1"))
        {
            // 计算认证哈希
            var hash = CalculateHash(welcomeMessage.Substring(2, 8));
            authString = $"%1{hash}";
        }
        
        // 发送带认证的命令
        var commandBytes = Encoding.ASCII.GetBytes($"{authString}{command}\r");
        await stream.WriteAsync(commandBytes, 0, commandBytes.Length);
        
        // 读取响应
        bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
        return Encoding.ASCII.GetString(buffer, 0, bytesRead);
    }
    
    // 计算认证哈希
    private string CalculateHash(string salt)
    {
        if (string.IsNullOrEmpty(_password)) return "";
        return $"{salt}{_password.GetHashCode():X8}";
    }

    // 电源控制
    public async Task PowerOnAsync() => await SendCommandAsync("%1POWR 1");
    public async Task PowerOffAsync() => await SendCommandAsync("%1POWR 0");
    public async Task<string> GetPowerStatusAsync() => await SendCommandAsync("%1POWR ?");

    // 3D模式控制(理光特有命令)
    public async Task Set3DModeAsync(int mode)
    {
        // 理光3D模式代码:
        // 0 = 3D关闭, 1 = 帧连续, 2 = 并排, 3 = 上下, 4 = 帧封装
        await SendCommandAsync($"%1AVMT 3D {mode}");
    }
    
    public async Task<string> Get3DModeAsync() => await SendCommandAsync("%1AVMT 3D ?");

    // 输入源切换
    //public async Task SetInputSourceAsync(string source)
    //{
    //    // 输入源代码示例:
    //    // RGB1 = 11, RGB2 = 12, HDMI1 = 31, HDMI2 = 32, Network = 41
    //    await SendCommandAsync($"%1INPT {source}");
    //}

    // 信号源切换方法
    public async Task SetInputSourceAsync(string sourceCode)
    {
        // 验证输入源代码格式
        if (!System.Text.RegularExpressions.Regex.IsMatch(sourceCode, @"^\d{2}$"))
        {
            throw new ArgumentException("输入源代码必须是两位数字", nameof(sourceCode));
        }
        // 输入源代码示例:
        // RGB1 = 11, RGB2 = 12, HDMI1 = 31, HDMI2 = 32, Network = 41
        await SendCommandAsync($"%1INPT {sourceCode}");
    }

    // 获取当前输入源
    public async Task GetCurrentInputSourceAsync()
    {
        var response = await SendCommandAsync("%1INPT ?");
        // 解析响应 (格式: %1INPT=xx)
        if (response.Contains("="))
        {
            return response.Split('=')[1].Trim();
        }
        return "未知";
    }


 

}

 

 

使用

// 使用示例
public static async Task Main()
{
    var controller = new PJLinkController("192.168.1.100"); // 替换为投影机实际IP
    
    // 开机
    await controller.PowerOnAsync();
    Console.WriteLine("已发送开机命令");
    
    // 等待投影机启动
    await Task.Delay(30000); // 等待30秒
    
    // 切换到HDMI1
    await controller.SetInputSourceAsync("31");
    Console.WriteLine("已切换到HDMI1");
    
    // 开启3D模式(帧连续)
    await controller.Set3DModeAsync(1);
    Console.WriteLine("已开启3D模式");
    
    // 获取电源状态
    var status = await controller.GetPowerStatusAsync();
    Console.WriteLine($"电源状态: {status}");
    
    // 5分钟后关机
    await Task.Delay(300000);
    await controller.PowerOffAsync();
    Console.WriteLine("已发送关机命令");
}

 

ffmpeg 命令参数

1. 下载地址

https://ffmpeg.org/download.html
https://www.gyan.dev/ffmpeg/builds/
https://github.com/BtbN/FFmpeg-Builds/releases
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n7.1-latest-linux64-lgpl-shared-7.1.tar.xz
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n7.1-latest-linux64-lgpl-7.1.tar.xz
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n6.1-latest-win64-lgpl-shared-6.1.zip
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n6.1-latest-win64-lgpl-6.1.zip

 

2. 常用命令
视频缩放,

ffmpeg -i in.mp4 -vf "scale=iw*0.25:ih*0.25" -preset ultrafast -c:v libx264  out.mpt

麒麟系统安装达梦数据库-Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso

https://distro-images.kylinos.cn:8802/web_pungi/download/share/hXaJrnQWscuN2YtS7VAZizRP0EFbH4y3/

电子物料下载
下载后请使用checkisomd5命令(由isomd5sum软件包提供)检查文件完整性。
如果提示“The media check is complete, the result is: PASS.”则表示下载正常。
如果提示FAIL则请重新下载;提示N/A则表示该iso文件不包含md5校验值,请测试能否使用该iso正常启动安装程序
本地下载:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso
SHA256: 6f0d388af9f8e0aba70825aae69ab36bd39849c5cd9dcf05696528203e7a22d0

https://iso.kylinos.cn/web_pungi/download/cdn/9D2GPNhvxfsF3BpmRbJjlKu0dowkAc4i/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso

达梦数据库 DM8 安装包
https://eco.dameng.com/download/
LinuxRPM 安装包
https://download.dameng.com/eco/adapter/DM8/202505/dm8_20250506_x86_rh7_64.zip
Windows64位安装包
https://download.dameng.com/eco/adapter/DM8/202505/dm8_20250430_x86_win_64.zip

js vue 并行执行异步操作

import { ref, onMounted } from 'vue';
import axios from 'axios';
export default {
  setup() {
    // 声明响应式数据引用
    const data = ref(null);
    const data2 = ref(null);
    const data3 = ref(null);
    const data4 = ref(null);
    onMounted(async () => {
      // 使用Promise.all来处理并发的axios请求
      await Promise.all([
        axios.get('https://api.example.com/data'),
        axios.get('https://api.example.com/data2'),
        axios.get('https://api.example.com/data3'),
        axios.get('https://api.example.com/data4')
      ]).then(responses => {
        // 所有请求成功完成后,更新响应式数据
        data.value = responses[0].data;
        data2.value = responses[1].data;
        data3.value = responses[2].data;
        data4.value = responses[3].data;
        // 这里可以放置所有异步任务完成后的代码...
      }).catch(error => {
        // 处理请求中出现的任何错误
        console.error('请求错误:', error);
      });
    });
    // 返回响应式状态供模板或其他Composition API使用
    return {
      data,
      data2,
      data3,
      data4
    };
  }
};

 

====
参考
https://developer.aliyun.com/article/1656953