Fedora进行ffmpeg+nginx+rtmp服务器配置局域网推流

本文详细介绍在Fedora系统中解决镜像源更新问题、配置nginx和rtmp模块、安装及配置FFmpeg的方法,并实现局域网内的推流与拉流功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

最近做的一个项目需要使用arm开发板调用摄像头获取图片数据发送到后端,由于开发板是fedora系统,所以踩了不少坑。特此记录下来。

一.先对Fedora镜像源进行一次更新

https://developer.aliyun.com/mirror/fedora

1.如果在配置好后,获取 GPG 密钥失败:[Errno 14] curl#37 - “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7”

https://blog.youkuaiyun.com/who__are__you_/article/details/82628390

2.如果安装包时出现:

$ dnf install xxx
$ Error: Failed to synchronize cache for repo

https://blog.youkuaiyun.com/l1175832366/article/details/104175396

3.如果运行sudo yum makecache生成缓存会报错:

执行以下命令:

sed -i 's/releases\/$releasever/releases\/32/g' /etc/yum.repos.d/fedora.repo
sed -i 's/updates\/$releasever/updates\/32/g' /etc/yum.repos.d/fedora-updates.repo

二.配置nginx和rtmp

https://blog.youkuaiyun.com/heng615975867/article/details/80519274
配置完成后,把下载目录里面的nginx-rtmp-module-master移到/usr/local/nginx中,因为可能没有移过去

三.配置FFmpeg

https://www.cnblogs.com/codeAB/p/9167107.html
安装完之后可能需要添加环境变量:

vim /etc/profile

添加一行

export PATH=/usr/local/ffmpeg/bin/:$PATH\

刷新环境

souce /etc/profile

如果在命令行中输入ffmpeg没有报找不到的错误就成功。如果显示找不到,那就是环境变量没有配置好。

四.在局域网内进行推流拉流

1.推流

将里面的地址修改成你要推流的地址

rtmpUrl = "rtmp://139.159.142.192:1935/live/1"

如果想要调用摄像头的参数设为0显示找不到摄像头,就参考下面的查找本机摄像头序号。因为我用的是AI开发板,所以直接输入0可能调用不了。

vid = cv2.VideoCapture(r"/usr/local/web/studey/mysite/chat/video/4.mp4")
import cv2
import queue
import os
import numpy as np
from threading import Thread
import datetime, _thread
import subprocess as sp
from time import  *
 
# 使用线程锁,防止线程死锁
mutex = _thread.allocate_lock()
# 存图片的队列
frame_queue = queue.Queue()
# 推流的地址,前端通过这个地址拉流,主机的IP,2019是ffmpeg在nginx中设置的端口号
rtmpUrl = "rtmp://139.159.142.192:1935/live/1"
 
# 用于推流的配置,参数比较多,可网上查询理解
command = ['ffmpeg',
           '-y',
           '-f', 'rawvideo',
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', "{}x{}".format(640, 480),  # 图片分辨率
           '-r', str(25.0),  # 视频帧率
           '-i', '-',
           '-c:v', 'libx264',
           '-pix_fmt', 'yuv420p',
           '-preset', 'ultrafast',
           '-f', 'flv',
           rtmpUrl]
 
 
def Video():
    # 调用相机拍图的函数
    vid = cv2.VideoCapture(r"/usr/local/web/studey/mysite/chat/video/4.mp4")
    if not vid.isOpened():
        raise IOError("Couldn't open webcam or video")
    while (vid.isOpened()):
        return_value, frame = vid.read()
        # 原始图片推入队列中
        frame_queue.put(frame)
 
 
def push_frame():
    # 推流函数
    accum_time = 0
    curr_fps = 0
    fps = "FPS: ??"
    prev_time = time()
 
    # 防止多线程时 command 未被设置
    while True:
        if len(command) > 0:
            # 管道配置,其中用到管道
            p = sp.Popen(command, stdin=sp.PIPE)
            break
 
    while True:
        if frame_queue.empty() != True:
            # 从队列中取出图片
            frame = frame_queue.get()
            # curr_time = timer()
            # exec_time = curr_time - prev_time
            # prev_time = curr_time
            # accum_time = accum_time + exec_time
            # curr_fps = curr_fps + 1
 
            # process frame
            # 你处理图片的代码
            # 将图片从队列中取出来做处理,然后再通过管道推送到服务器上
            # 增加画面帧率
            # if accum_time > 1:
            # accum_time = accum_time - 1
            # fps = "FPS: " + str(curr_fps)
            # curr_fps = 0
 
            # write to pipe
            # 将处理后的图片通过管道推送到服务器上,image是处理后的图片
            p.stdin.write(frame.tostring())
 
 
def run():
    # 使用两个线程处理
    thread1 = Thread(target=Video, )
    thread1.start()
    thread2 = Thread(target=push_frame, )
    thread2.start()
 
if __name__ == '__main__':
    run()

2.拉流

拉流使用你的推流地址

vid = cv2.VideoCapture("你的推流地址")

3.查看链接摄像头号:

https://blog.youkuaiyun.com/weixin_44345862/article/details/91047938?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%9F%A5%E7%9C%8B%E8%BF%9E%E6%8E%A5%E6%91%84%E5%83%8F%E5%A4%B4%E5%8F%B7&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-91047938.nonecase&spm=1018.2226.3001.4187

五.fedora进行opencv3.2配置

https://blog.youkuaiyun.com/keith_bb/article/details/54172899?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-2.tagcolumn&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-2.tagcolumn

<think>嗯,用户想了解如何通过软件实现Livox Tele和Realsense D435i的时间同步。首先,我需要回忆这两种设备的时间同步机制。记得Livox激光雷达通常有自己的时间同步接口,而Realsense D435i可能有硬件触发或软件时间戳的方式。 首先,时间同步一般分为硬件同步和软件同步。硬件同步需要物理连接,比如用PTP或者GPS同步,但用户问的是软件方法,所以可能需要依赖软件时间戳。不过软件同步的精度可能不如硬件,需要考虑时间戳对齐的方法。 Livox Tele的SDK文档里可能有获取时间戳的函数,比如设备启动后的相对时间或者系统时间。Realsense D435i的librealsense库应该也提供时间戳,但要注意是相机时钟的时间还是系统时间。如果两者都使用系统时间,可能直接比较,但可能存在延迟问题。 可能需要将两者的时间戳统一到同一时间源,比如系统时钟。例如,在数据采集时,记录系统时间作为基准,然后调整两者的时间差。或者,使用NTP同步系统时间,但局域网内的NTP同步精度可能在毫秒级,可能不够。 另一个方法是在代码中同时获取两个设备的数据,并记录各自的时间戳,然后通过插值或外来对齐时间。比如,当激光雷达和相机的帧率不同时,可以用最近的激光雷达数据对应相机的某一帧,反之亦然。 此外,可能需要考虑数据采集的触发机制。比如,用外部信号触发两者同时采集,但软件实现的话可能需要自定义触发信号,或者利用设备的软件触发功能。 还需要注意两者的时间戳精度和延迟。比如,Realsense D435i的IMU数据可能有不同的时间戳,需要分别处理。可能需要为每个传感器数据打上统一的时间标签,然后在后期处理中进行时间对齐。 另外,参考用户提供的引用内容,他们之前的工作是关于多激光雷达的标定和同步,可能涉及到分布式框架的时间同步方法,但这里的问题是两个不同设备,可能需要更基础的方法。引用中提到的问题,比如DL直接出轨迹的不稳定性,可能提示时间同步需要更可靠的方法,而不是依赖后期处理。 综上,可能的步骤包括:检查设备的SDK时间戳来源,统一时间基准(如系统时间),软件记录时的时间戳对齐,或者后期插值处理。需要具体查阅Livox和Realsense的文档,确认时间戳类型,然后编写代码进行同步。</think>### Livox Tele与Realsense D435i软件时间同步实现方法 #### 1. **理解设备时间戳机制** - **Livox Tele**:通过SDK获取的时间戳通常基于设备内部时钟,可通过`livox_ros_driver`的API直接读取。例如,点云数据中的时间戳字段为设备上电后的相对时间(单位:纳秒)[^1]。 - **Realsense D435i**:其时间戳通过`librealsense`库提供,默认使用相机内部时钟。IMU和图像数据的时间戳可能独立,需通过`get_timestamp()`函数获取。 #### 2. **统一时间基准** - **方案1:对齐系统时间** 通过NTP协议同步主机系统时间,使两者数据的时间戳基于同一系统时钟。需确保设备连接的计算机已启用NTP同步(局域网内精度约1-10ms): ```bash sudo apt install chrony sudo systemctl restart chrony ``` - **方案2:软件触发对齐** 在代码中设置同步触发信号,例如: ```python # 伪代码示例(需结合具体SDK实现) import time trigger_time = time.time() # 获取当前系统时间 livox_data = get_livox_data() # 获取Livox数据并记录时间戳 realsense_data = get_realsense_data() # 获取Realsense数据并记录时间戳 # 计算时间偏移量并补偿 ``` #### 3. **时间戳补偿与插值** - **步骤**: 1. 记录设备首次数据的时间戳$t_{\text{livox}}$和$t_{\text{realsense}}$。 2. 计算初始时间偏移量$\Delta t = t_{\text{livox}} - t_{\text{realsense}}$。 3. 后续数据通过偏移量对齐,若存在时钟漂移,需动态修正(如线性拟合)。 - **插值示例**(以点云与图像对齐为例): $$t_{\text{target}} = t_{\text{image}} + \Delta t$$ 在点云数据中查找最接近$t_{\text{target}}$的帧,或通过线性插值生成虚拟帧。 #### 4. **代码实现参考** ```python # 基于ROS的同步示例(使用message_filters) import rospy from message_filters import ApproximateTimeSynchronizer, Subscriber from livox_ros_driver.msg import CustomMsg from sensor_msgs.msg import Image def callback(livox_msg, image_msg): # 对齐后的数据处理逻辑 pass livox_sub = Subscriber('/livox/points', CustomMsg) image_sub = Subscriber('/camera/color/image_raw', Image) ats = ApproximateTimeSynchronizer([livox_sub, image_sub], queue_size=5, slop=0.01) ats.registerCallback(callback) rospy.spin() ``` #### 5. **注意事项** - **精度限制**:纯软件同步精度通常在10-50ms级别,若需更高精度需硬件触发(如Realsense的`HARDWARE_TIMESTAMP`模式)。 - **延迟校准**:考虑传感器数据处理和传输延迟,可通过实验测量固定延迟值并补偿。 - **多线程优化**:分离数据采集与处理线程,避免阻塞导致时间戳失真[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值