gstreamer Windows环境安装。

安装开发包+运行包。
环境变量,在path中将bin目录加入,例如:C:\gstreamer\1.0\msvc_x86_64\bin

 
播放本地视频。
gst-launch-1.0.exe playbin uri=file:///d:/test/AdamGrosser_2007-light.mp4

gst-launch-1.0.exe playbin uri=file:///d:/test/AdamGrosser_2007.mp4

gst-launch-1.0.exe playbin uri=file:///d:/test/AdamDriver_2015P-480p.mp4

rtsp本地服务部署启动。


mediamtx, win7支持到v1.0.0版本。
FFmpeg, win7支持到 6.0版本。
其他说明:GPL vs LGPL,这组区别是最重要的,它关乎法律和版权。
GPL(通用公共许可证)
要求:如果你在项目中使用 GPL 授权的代码,那么你的整个项目也必须以 GPL 许可证开源。
对 FFmpeg 的影响:gpl 版本包含了一些受 GPL 约束的编码器,最著名的是 x264(H.264 视频编码器)和 x265(HEVC/H.265 视频编码器)。些是当今最常用的高质量编码器。
简单理解:用了 gpl 版本,你的软件就必须开源。
LGPL(较宽松的通用公共许可证)
要求:相对宽松。你可以将 LGPL 授权的代码以动态链接库(DLL)的形式用于闭源商业软件,而无需开源你的整个项目。但如果你修改了 LGPL 库本身的代码,则需要将修改部分开源。
对 FFmpeg 的影响:lgpl 版本不包含受 GPL 约束的编码器(如 x264, x265)。它只包含 LGPL 授权的代码和一些没有版权限制的代码。
简单理解:用 lgpl 版本,可以开发闭源软件,但功能上缺少一些强大的编码器。

启动rtsp服务


将两个安装包解压到同一个目录下,cmd执行mediamtx.exe,输出[RTSP] listener opened on :8554则说明rtsp服务启动正常。
cmd输出:
D:\rtsp_test>mediamtx.exe
2025/10/21 09:58:50 INF MediaMTX v1.0.0
2025/10/21 09:58:50 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP),
:8001 (UDP/RTCP)
2025/10/21 09:58:50 INF [RTMP] listener opened on :1935
2025/10/21 09:58:50 INF [HLS] listener opened on :8888
2025/10/21 09:58:50 INF [WebRTC] listener opened on :8889 (HTTP)
2025/10/21 09:58:50 INF [SRT] listener opened on :8890 (UDP)


执行推流到本地rtsp服务。


ffmpeg -re -stream_loop -1 -i 你视频的文件名 -c copy -f rtsp rtsp://127.0.0.1:8554/video
ffmpeg -re -stream_loop -1 -i AdamGrosser_2007-light.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/video

cmd执行后输出及解释。

D:\rtsp_test>ffmpeg -re -stream_loop -1 -i AdamGrosser_2007-light.mp4 -c copy -f
 rtsp rtsp://127.0.0.1:8554/video
ffmpeg version n6.0.1-20231130 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13.2.0 (crosstool-NG 1.25.0.232_c175b21)
  configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-conf
ig=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw
32 --enable-version3 --disable-debug --disable-w32threads --enable-pthreads --en
able-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribi
di --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-op
encl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enabl
e-amf --enable-libaom --enable-libaribb24 --disable-avisynth --enable-chromaprin
t --enable-libdav1d --disable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec -
-enable-cuda-llvm --disable-frei0r --enable-libgme --enable-libkvazaar --enable-
libass --enable-libbluray --disable-libjxl --enable-libmp3lame --enable-libopus
--enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-lib
webp --enable-lv2 --enable-libvpl --enable-openal --enable-libopencore-amrnb --e
nable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libop
enmpt --enable-librav1e --disable-librubberband --enable-schannel --enable-sdl2
--enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable
-libuavs3d --disable-libdrm --disable-vaapi --disable-libvidstab --enable-vulkan
 --enable-libshaderc --disable-libplacebo --disable-libx264 --disable-libx265 --
disable-libxavs2 --disable-libxvid --enable-libzimg --enable-libzvbi --extra-cfl
ags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexe
flags= --extra-libs=-lgomp --extra-version=20231130
  libavutil      58.  2.100 / 58.  2.100
  libavcodec     60.  3.100 / 60.  3.100
  libavformat    60.  3.100 / 60.  3.100
  libavdevice    60.  1.100 / 60.  1.100
  libavfilter     9.  3.100 /  9.  3.100
  libswscale      7.  1.100 /  7.  1.100
  libswresample   4. 10.100 /  4. 10.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004c81c0] stream 0, timescale not set
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'AdamGrosser_2007-light.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    creation_time   : 2011-05-01T15:50:33.000000Z
    podcast         : 1
    media_type      : 0
    title           : TED: Adam Grosser (2007)
    artist          : TED
    date            : 2007
    album           : TEDTalks
    comment         : To learn more about this speaker, find other TEDTalks, and
 subscribe to this Podcast series, visit www.TED.com   Feedback: tedtalks@ted.co
m
    genre           : Podcast
    category        : Higher Education
  Duration: 00:03:34.42, start: 0.000000, bitrate: 85 kb/s
  Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661),
 yuv420p(progressive), 320x180 [SAR 1:1 DAR 16:9], 40 kb/s, 12 fps, 12 tbr, 12 t
bn (default)
    Metadata:
      creation_time   : 2011-04-27T16:01:06.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 24000 Hz, mono, fl
tp, 23 kb/s (default)
    Metadata:
      creation_time   : 2011-05-01T15:50:35.000000Z
      handler_name    : GPAC ISO Audio Handler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x0]: Video: png, rgba(pc), 600x600 [SAR 2835:2835 DAR 1:1], 90k t
br, 90k tbn (attached pic)
Output #0, rtsp, to 'rtsp://127.0.0.1:8554/video':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isom
    category        : Higher Education
    podcast         : 1
    media_type      : 0
    title           : TED: Adam Grosser (2007)
    artist          : TED
    date            : 2007
    album           : TEDTalks
    comment         : To learn more about this speaker, find other TEDTalks, and
 subscribe to this Podcast series, visit www.TED.com   Feedback: tedtalks@ted.co
m
    genre           : Podcast
    encoder         : Lavf60.3.100
  Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv4
20p(progressive), 320x180 [SAR 1:1 DAR 16:9], q=2-31, 40 kb/s, 12 fps, 12 tbr, 9
0k tbn (default)
    Metadata:
      creation_time   : 2011-04-27T16:01:06.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 24000 Hz, mono, fltp, 2
3 kb/s (default)
    Metadata:
      creation_time   : 2011-05-01T15:50:35.000000Z
      handler_name    : GPAC ISO Audio Handler
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=    0 fps=0.0 q=-1.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0k
frame=   10 fps=0.0 q=-1.0 size=N/A time=00:00:00.58 bitrate=N/A speed=1.13x
frame=   16 fps= 16 q=-1.0 size=N/A time=00:00:01.08 bitrate=N/A speed=1.07x
frame=   22 fps= 14 q=-1.0 size=N/A time=00:00:01.58 bitrate=N/A speed=1.04x

命令概述

你执行的命令是:

ffmpeg -re -stream_loop -1 -i AdamGrosser_2007-light.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/video

  • -re:以原始帧率读取输入文件,模拟实时流。

  • -stream_loop -1:无限循环输入视频。

  • -i AdamGrosser_2007-light.mp4:指定输入文件。

  • -c copy:流复制,不重新编码,效率最高。

  • -f rtsp:指定输出格式为 RTSP。

  • rtsp://127.0.0.1:8554/video:RTSP 服务器的目标地址。


输出详解

1. FFmpeg 版本和构建信息

ffmpeg version n6.0.1-20231130 Copyright (c) 2000-2023 the FFmpeg developers built with gcc 13.2.0 (crosstool-NG 1.25.0.232_c175b21) configuration: --prefix=/ffbuild/prefix ... (省略)

这部分显示了您使用的 FFmpeg 版本(n6.0.1)、编译时间和编译配置。它表明您使用的是一个功能非常全面的构建版本。

2. 库版本信息

libavutil 58. 2.100 / 58. 2.100 libavcodec 60. 3.100 / 60. 3.100 ...

这些是 FFmpeg 核心库的版本号,对于一般用户来说,知道这是核心组件即可。

3. 输入文件分析

[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004c81c0] stream 0, timescale not set Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'AdamGrosser_2007-light.mp4':

FFmpeg 识别出输入文件是一个 MP4 容器。timescale not set 是一个警告,但在这个上下文中通常可以忽略,不影响推流。

文件元数据:

Metadata: major_brand : isom ... title : TED: Adam Grosser (2007) ... Duration: 00:03:34.42, start: 0.000000, bitrate: 85 kb/s

显示了文件的元信息(如标题、艺术家等),以及总时长(3分34秒)和平均比特率(85 kb/s,这是一个非常低的码率视频)。

流信息:
这是最关键的部分,说明了文件内包含的媒体流。

  • Stream #0:0视频流

    • 编码格式:H.264 (Constrained Baseline)

    • 像素格式:yuv420p(progressive)(逐行扫描)

    • 分辨率:320x180

    • 码率:40 kb/s

    • 帧率:12 fps

    • 时间基:12 tbr, 12 tbn(这些是内部时间单位,通常帧率 fps 是最重要的)

  • Stream #0:1音频流

    • 编码格式:AAC (LC)

    • 采样率:24000 Hz

    • 声道:mono(单声道)

    • 码率:23 kb/s

  • Stream #0:2附加图片(可能是专辑封面)

    • 编码格式:PNG

    • 分辨率:600x600

    • 注意:这个流没有被推流,因为你的命令默认只选择了第0个(视频)和第1个(音频)流。

4. 输出目标设置

Output #0, rtsp, to 'rtsp://127.0.0.1:8554/video':

FFmpeg 确认输出目标为 RTSP 协议,地址是 rtsp://127.0.0.1:8554/video

流映射:

Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)

这清晰地显示了输入流到输出流的映射关系。(copy) 表示是流复制,没有重新编码。效率极高,CPU 占用率几乎为0。

5. 实时推流状态

这是滚动的实时信息,反映了推流的健康状况。

Press [q] to stop, [?] for help
frame=   10 fps=0.0 q=-1.0 size=N/A time=00:00:00.58 bitrate=N/A speed=1.13x
frame=   16 fps= 16 q=-1.0 size=N/A time=00:00:01.08 bitrate=N/A speed=1.07x
...
frame=  490 fps= 12 q=-1.0 size=N/A time=00:00:40.58 bitrate=N/A speed=0.926x
  • frame=xxx:已处理并发送的视频帧总数。

  • fps=xx:当前的推流帧率。它会逐渐稳定在输入视频的原始帧率(12 fps)附近。这是推流是否顺畅的关键指标。

  • q=-1.0质量指标-1.0 对于流复制模式是正常的,因为它不经过编码器的质量评估。如果进行重新编码,这个值会变化(例如q=29.0),值越大表示质量越差(压缩越多)。

  • size=N/A / bitrate=N/A:在流复制到某些格式时,FFmpeg 无法实时计算输出大小和码率,所以显示 N/A。这是正常现象。

  • time=xx:当前已推流的时间点。它应该随着视频播放而稳定增长。

  • speed=xxx:处理速度相对于实时播放的倍数。

    • 1.0x 表示正好是实时速度(受 -re 参数控制)。

    • 略高于或低于 1.0x 是正常的波动。

    • 如果持续远低于 1.0x(如 0.5x),则说明系统(可能是网络、磁盘I/O或服务器处理能力)跟不上,会导致推流卡顿。

总结

从输出可以得出以下结论:

  1. 推流成功:FFmpeg 成功连接到了本地的 MediaMTX 服务器,并开始了流传输。

  2. 模式高效:使用了 -c copy(流复制),CPU 占用极低,视频质量无损。

  3. 流内容:正在推送一个低码率(85kbps)、低分辨率(320x180)的 H.264 视频和 AAC 音频流。

  4. 状态健康

    • 帧率(fps)稳定在源文件的 12 fps 左右。

    • 处理速度(speed)在 1.0 附近轻微波动,属于正常现象,没有出现持续的大幅掉速。

    • 时间线在稳定增长。

简单来说,你的本地 RTSP 流媒体服务器正在完美运行,FFmpeg 正在稳定地向它推送视频流。 你现在可以用 VLC 播放器或其他 RTSP 客户端打开 rtsp://127.0.0.1:8554/video 来观看这个循环播放的视频了。

gstreamer读取本地视频推流到本地rtsp服务

执行命令:

gst-launch-1.0 filesrc location=D:\rtsp_test\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder enable-max-performance=1 ! nvv4l2h264enc ! rtspclientsink location = rtsp://localhost:8554/mystream

报错如下:

WARNING: erroneous pipeline: no element "nvv4l2decoder"

这个错误说明您的系统上没有 nvv4l2decoder 元素。这是 NVIDIA 专用的硬件解码器,只在安装了 NVIDIA GPU 和相应 GStreamer 插件的系统上可用。

让我为您提供几个通用的替代方案:

方案 1:使用软件解码(通用方案)

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! avdec_h264 ! videoconvert ! x264enc ! rtspclientsink location=rtsp://localhost:8554/mystream

方案 2:更稳定的软件编解码方案

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux name=demux \
demux.video_0 ! queue ! h264parse ! avdec_h264 ! videoconvert ! x264enc ! h264parse ! rtspclientsink location=rtsp://localhost:8554/mystream

方案 3:流复制模式(最高效,如果视频编码兼容)

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux name=demux \
demux.video_0 ! queue ! h264parse ! rtspclientsink location=rtsp://localhost:8554/mystream

方案 4:包含音频流的完整方案

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux name=demux \
demux.video_0 ! queue ! h264parse ! avdec_h264 ! videoconvert ! x264enc ! h264parse ! mux. \
demux.audio_0 ! queue ! aacparse ! avdec_aac ! audioconvert ! audioresample ! voaacenc ! mux. \
rtpmp4pay name=mux ! rtspclientsink location=rtsp://localhost:8554/mystream

硬件加速方案(根据您的显卡选择)

如果是 NVIDIA 显卡,但缺少插件:

# 首先安装 NVIDIA GStreamer 插件
# Ubuntu: sudo apt install gstreamer1.0-nvidia
# 然后使用:
gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! nvdec ! nvh264enc ! rtspclientsink location=rtsp://localhost:8554/mystream

如果是 Intel 集成显卡:

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! vaapih264dec ! vaapih264enc ! rtspclientsink location=rtsp://localhost:8554/mystream

如果是 AMD 显卡:

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! avdec_h264 ! videoconvert ! amfh264enc ! rtspclientsink location=rtsp://localhost:8554/mystream

诊断您的 GStreamer 环境

要查看您系统上可用的编解码器,可以运行这些命令:

# 查看所有 H.264 相关的元素
gst-inspect-1.0 | grep 264

# 查看可用的解码器
gst-inspect-1.0 | grep dec

# 查看可用的编码器
gst-inspect-1.0 | grep enc

# 检查是否有 NVIDIA 元素
gst-inspect-1.0 | grep nv

推荐的使用顺序

  1. 首先尝试方案 3(流复制) - 如果您的视频本来就是 H.264 编码,这是最有效的方法

  2. 如果方案 3 不行,尝试方案 1(软件编解码) - 最通用的方案

  3. 根据诊断结果选择硬件加速方案 - 如果需要更好的性能

注意事项

  • 在 Windows 路径中使用 D:\\rtsp_test\\(双反斜杠)或 D:/rtsp_test/(正斜杠)

  • 确保 MediaMTX 或 RTSP 服务器正在运行在 localhost:8554

  • 如果遇到音频问题,可以先用纯视频方案测试

建议您先从方案 1 开始测试,这是最通用的跨平台解决方案。

最终使用命令如下:

gst-launch-1.0 filesrc location=D:\\rtsp_test\\AdamGrosser_2007-light.mp4 ! qtdemux ! queue ! h264parse ! rtspclientsink location=rtsp://localhost:8554/mystream

rtsp推流,及播放验证OK。

参考:
windows环境下,搭建RTSP视频推流服务器:https://blog.csdn.net/EthanCo/article/details/125321957

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐