[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 解码显示

相关推荐
晨间晓6 分钟前
单目视频测速不准?我给 YOLO + ByteTrack 加了透视标定和鸟瞰图测速
yolo·音视频
半杯咖啡半行码31 分钟前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
别动我齐刘海1 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
龙虾电话1 小时前
语音机器人打断不进去:VAD 双阈值迟滞里一个共用的 bool,和它引发的连锁误判
linux
honsor1 小时前
机房IP化改造首选:以太网温湿度传感器,PoE供电+Modbus TCP一网搞定
linux·运维·服务器
2401_868534782 小时前
数据交换方式
服务器·网络
默|笙2 小时前
【Linux网络】_udp_socket(认识)
linux·网络·udp
程序员梅雨2 小时前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
中屹指纹浏览器svip2 小时前
打开账号环境网页报错,常见原因有哪些?
服务器·开发语言·php·中屹指纹浏览器
lingran__2 小时前
Linux进程万字详解(二)|进程状态深度剖析:调度队列、内核链表、D状态设计哲学、僵尸孤儿进程与Slab机制
linux·进程管理·内核链表·pcb·僵尸进程·孤儿进程·进程状态