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

相关推荐
Cosolar18 分钟前
LlamaIndex索引类型全解析:原理与实战指南
运维·服务器
方便面不加香菜3 小时前
Linux--基础IO(一)
linux·运维·服务器
小鹿研究点东西7 小时前
直播带货长视频AI自动剪辑开播:一场直播如何反复利用?
ffmpeg·自动化·音视频·语音识别
mounter6257 小时前
现代 Linux 内存管理的演进与变革:从传统 LRU 到多代架构 MGLRU
linux·服务器·kernel
赵渝强老师8 小时前
【赵渝强老师】Kubernetes(K8s)中的金丝雀升级
linux·docker·云原生·容器·kubernetes
换个昵称都难8 小时前
webrtc PeerConnection 模块介绍
音视频·webrtc
Qt程序员8 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
The Sheep 20238 小时前
Vue复习
linux·服务器·数据库
兄台の请冷静8 小时前
Linux 安装es
linux·elasticsearch·jenkins
fengyehongWorld8 小时前
Linux rg命令
linux