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

相关推荐
speop10 分钟前
hell-gpu| TASK01-2
linux·运维·算法
byte轻骑兵23 分钟前
【BlueZ 】用户态入口:main.c 核心函数与程序启动流程
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
Tisfy1 小时前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
liulilittle1 小时前
REALITY 代理隧道的有效检测方法: 被动、主动与确定性三层实证研究
linux·服务器·网络·网络协议·安全·网络安全·通信
邪修king2 小时前
Re:Linux 系统篇(十五):进程篇(四):进程切换深度解析 —— CPU 寄存器、进程上下文与切换全流程万字详解
linux·运维·服务器
纽格立科技2 小时前
埋在地下的那张铜网
车载系统·音视频·信息与通信·传媒
高亦真2 小时前
今天是学习嵌入式的第33天
linux·学习·算法
cuijiecheng20182 小时前
Rocky Linux 安装 libltc、ltc-tools 和 ltcdump
linux
BlueAsia_Lab2 小时前
BQB 认证执行标准是什么?核心条款通俗解读
linux·运维·网络
极客猴子2 小时前
iPhone免费版支持思维导图导出的会议APP推荐:导出能力对照
人工智能·智能手机·音视频·机器翻译