当前位置: 首页 > news >正文

操作定制万年历投屏模拟点单叫号器

目前某些10寸的万年历,电子相册,价格到了100多点,一块屏幕也就这样吧。不论是什么材质的吧,再加50可以支持dlna投屏,还要啥自行车。
我一直在寻找一块可以报号的屏幕和喇叭,就是点餐报号用的,目前成套下来,无线键盘+3位数字的屏幕,也是100上下。
我一般只开1周完成的项目,这次也这样,定时一周,把叫号的内容投屏到电子万年历上。这样不叫号,还能当日历用。现在想来,有空闲了,就叫一个号码,也就是比如餐好了。屏幕就叫 一声,几号餐好。没事的时候,显示默认画面,这就好。
根据AI,ffmeg项目,可以pipen一个管道,python可以生成视频复合音频流。
通过dlna,cast chrome,airplay投送到万年历屏幕。其中dlna应该是兼容最好的。
第一天
2.26先定个目标,生成mpeg的视频流。
2.27
文字转语音是必须的,gtts需要谷歌在线,后来使用pyttsx3
https://blog.csdn.net/cui_yonghua/article/details/134611001

import pyttsx3
pyttsx3.speak("I will speak this text")
import os
import cv2
import time
import subprocess
#import numpy as np 
from pyttsx3 import init
from pydub import AudioSegment
from threading import Thread

class ImageRTSPStreamer:
    def __init__(self, img_paths, tts_text, fps=25, rtsp_url="rtsp://localhost:8554/mytts"):
        self.img_paths = img_paths
        self.tts_text = tts_text
        self.fps = fps
        self.rtsp_url = rtsp_url
        self.audio_ready = False
        
    def generate_audio(self):
        """生成语音并转码为PCM WAV格式"""
        tts = gTTS(text=self.tts_text, lang='en')
        tts.save("temp_audio.mp3")
        
        engine = init()
        engine.setProperty('rate', 150)  #速度 默认200
        engine.setProperty('volume', 0.9) 
        engine.save_to_file(self.tts_text, 'temp_audio.mp3')
        engine.runAndWait()
        # 转换为FFmpeg兼容的音频格式
        audio = AudioSegment.from_mp3("temp_audio.mp3")
        audio = audio.set_frame_rate(44100).set_channels(1)
        audio.export("temp_audio.wav", format="wav")
        
        # 转换到原始的PCM_S16LE格式
        subprocess.run([
            'ffmpeg', '-y',
            '-i', 'temp_audio.wav',
            '-f', 's16le',
            '-acodec', 'pcm_s16le',
            '-ar', '44100',
            'audio.raw'
        ])
        self.audio_ready = True
        os.remove("temp_audio.mp3")
        os.remove("temp_audio.wav")

    def send_video(self, pipe):
        """发送图片帧到FFmpeg管道"""
        frame_delay = 1 / self.fps
        idx = 0
        
        while True:
            img = cv2.imread(self.img_paths[idx])
            img = cv2.resize(img, (1280, 720))
            
            # YUV420P色彩空间转换
            yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV_I420)
            pipe.write(yuv.tobytes())
            
            # 更新图片索引
            idx = (idx + 1) % len(self.img_paths)
            time.sleep(frame_delay)

    def start_stream(self):
        # 生成音频
        t_audio = Thread(target=self.generate_audio)
        t_audio.start()
        
        # 启动FFmpeg合成管道
        ffmpeg_cmd = [
            'ffmpeg',
            '-y',
            '-f', 'rawvideo',        # 原始视频输入格式
            '-vcodec','rawvideo',
            '-pix_fmt', 'yuv420p',
            '-s', '1280x720',        # 分辨率与图片预处理一致
            '-r', str(self.fps),
            '-i', '-',               # 从stdin读取视频
            
            '-f', 's16le',           # PCM音频输入格式
            '-acodec','pcm_s16le',
            '-ar', '44100',
            '-ac', '1',
            '-i', 'audio.raw',       # 原始音频文件
            
            '-c:v', 'libx264',       # 视频编码器
            '-preset', 'ultrafast',
            '-tune', 'zerolatency',
            '-pix_fmt', 'yuv420p',
            '-g', '50',              # GOP大小
            
            '-c:a', 'aac',           # 音频编码器
            '-b:a', '128k',
            
            '-f', 'rtsp',            # 输出格式
            '-rtsp_transport', 'tcp',# 使用TCP传输降低丢包
            self.rtsp_url
        ]
        
        # 等待音频就绪
        while not self.audio_ready:
            time.sleep(0.1)
        
        # 启动FFmpeg进程
        proc = subprocess.Popen(
            ffmpeg_cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
        )
        
        # 发送视频帧
        self.send_video(proc.stdin)
        
        proc.stdin.close()
        proc.wait()

if __name__ == "__main__":
    img_folder = ["image1.jpg", "image2.jpg"]
    text = "请3号就诊!"
    
    streamer = ImageRTSPStreamer(
        img_paths=img_folder,
        tts_text=text,
        fps=5  # 匹配图片切换速度
    )
    streamer.start_stream()

哎 opencv 需要 cmake,

相关文章:

  • 【机器学习】 [代码篇] 30. KNN - sklearn 以及 自定义KNN 的实现
  • 【Elasticsearch】script_fields 和 runtime_fields的区别
  • 游戏引擎学习第124天
  • Graph and GNN——图的表示与图神经网络的介绍与应用
  • GateWay
  • Vue3核心编译库@vuecompiler-core内容分享
  • PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍
  • 每日一题-设计浏览器历史记录,关于栈的应用
  • 鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计
  • 十、大数据资源平台功能架构
  • 使用 frp 实现内网穿透:从零到一的完整指南
  • Uniapp 小程序复制、粘贴功能实现
  • c++:多态
  • 算法题(79):两个数组的交集
  • 七、Redis集群高可用
  • 第74节 绘制点和线条( LineTo 和 MoveTo )
  • lombok 的注解说明
  • 使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析
  • 0—QT ui界面一览
  • 【网络】HTTPS协议原理
  • 应急管理部派出工作组赴山西太原小区爆炸现场指导救援处置
  • 国家卫健委有关负责人就白皮书发布答记者问
  • 五一“大车流”来了,今日午后G40沪陕高速开始迎来出沪高峰
  • 神舟十九号载人飞行任务取得圆满成功
  • 中吉乌铁路重点控制性工程开工建设,包括三座隧道
  • 美的集团一季度净利增长38%,库卡中国机器人接单增超35%