[linux]视频实时推流项目

Makefile文件:

cpp 复制代码
# --- ROV 视频推流项目 Makefile ---

# 1. 指定交叉编译器 (你在 Ubuntu 上使用的编译器)
CC = aarch64-linux-gnu-gcc

# 2. 最终生成的执行文件名字
TARGET = rov_streamer

# 3. 你的 C 源代码文件 (如果有多个文件,用空格隔开,例如 a.c b.c)
SRCS = rov_streamer.c

# 4. 编译选项 (CFLAGS): 告诉编译器去哪里找 GStreamer 的头文件 (.h)
# 加入 -Wall 可以开启所有常见的编译警告,帮你写出更规范的代码
CFLAGS = -Wall \
         -I/usr/include/gstreamer-1.0 \
         -I/usr/include/glib-2.0 \
         -I/usr/lib/x86_64-linux-gnu/glib-2.0/include


# 5. 链接选项 (LDFLAGS): 告诉编译器链接哪些 GStreamer 的动态库 (.so)
LDFLAGS = -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0

# --- 下面是编译规则 ---

# 默认目标,当你只敲 `make` 时执行
all: $(TARGET)

# 如何生成目标文件
$(TARGET): $(SRCS)
        @echo "开始编译 $(TARGET) ..."
        $(CC) $(SRCS) -o $(TARGET) $(CFLAGS) $(LDFLAGS)
        @echo "编译成功!生成文件: $(TARGET)"

# 清理生成的中间文件和执行文件,当你敲 `make clean` 时执行
clean:
        @echo "清理项目..."
        rm -f $(TARGET)
        @echo "清理完成!"

文件send到板子

使用scp

Mob上面Serial敲入:

root@topeet:/# /etc/init.d/S50sshd start

Starting sshd: OK

用于启动ssh

Buildroot软件包配置:

rov_streamer.c代码:

cpp 复制代码
#include <gst/gst.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    GstElement *pipeline;
    GstBus *bus;
    GstMessage *msg;

    /* 1. 初始化 GStreamer */
    gst_init(&argc, &argv);

    /* 2. 构建推流管道字符串 (使用你测试成功的 RTP 逻辑) */
    /* 注意:代码中的双引号需要转义,末尾无需反斜杠 */
    const char *pipe_str = 
        "v4l2src device=/dev/video9 ! "
        "image/jpeg,width=640,height=480,framerate=30/1 ! "
        "jpegdec ! videoconvert ! video/x-raw,format=NV12 ! "
        "mpph264enc bps=2000000 gop=10 ! "
        "rtph264pay config-interval=1 ! "
        "udpsink host=192.168.1.89 port=5678 sync=false";

    printf("正在启动 ROV 视频流...\n");

    /* 3. 创建管道 */
    pipeline = gst_parse_launch(pipe_str, NULL);

    /* 4. 开始播放 */
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    /* 5. 等待错误或流结束 (或者你可以自己写循环控制) */
    bus = gst_element_get_bus(pipeline);
    msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE,
                                     GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

    /* 6. 释放资源 */
    if (msg != NULL)
        gst_message_unref(msg);
    gst_object_unref(bus);
    gst_element_set_state(pipeline, GST_STATE_NULL);
    gst_object_unref(pipeline);

    return 0;
}

视频流架构是:摄像头 -> V4L2 驱动 -> GStreamer (MPP 硬件编码) -> RTP over UDP -> Windows 以太网 -> SDP 解析 -> FFmpeg/ffplay 解码显示

相关推荐
赵民勇17 小时前
systemd-cgtop命令详解
linux·运维
hhwyqwqhhwy18 小时前
Ubuntu22.04 安装vitis
linux
NutShell Wang18 小时前
国产全模态开源潮:从语言模型到视频模型,中国开源生态再升级
人工智能·语言模型·开源·大模型·音视频·多模态·vibe coding
运维行者_18 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
March.s18 小时前
Nginx 服务器反向代理实战指南
服务器·nginx·github
刚入门的大一新生18 小时前
Linux-Linux第一个系统程序-进度条
linux·运维·服务器
wuminyu18 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
茫忙然19 小时前
Linux提权辅助查询工具——BinLens的安装和使用
linux·提权·binlens
FlightYe19 小时前
linux系统编程(八):阻塞与非阻塞IO对比
android·linux·运维·服务器·github·vim
淮北49419 小时前
ubuntu22 默认输入法调整频率
运维·服务器·git·ubuntu·elasticsearch