gstreamer - gstreamer 1.0 输入选择器
问题描述
我想在 RTSP 流和测试流之间切换。我使用输入选择器和这个管道:
input-selector name=selector ! rtph264depay ! h264parse ! matroskamux \
streamable=false min-index-interval=100000 ! \
filesink location=test.mkv videotestsrc ! \
video/x-raw, width=1024, height=768, framerate=30/1, clock-rate=90000 ! \
x264enc ! rtph264pay ! selector.sink_0 rtspsrc name=rtspsrc \
location=rtsp://admin:admin@192.168.88.231:554/h264 retry=100 \
udp-buffer-size=30000000 latency=200 caps="application/x-rtp, \
media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! \
selector.sink_1
我编写了每 5 秒切换一次源的 python 代码。但只有测试流被写入文件。我还在日志中看到警告
0:00:00.353575129 13560 0x23f5540 WARN basesrc gstbasesrc.c:2948:gst_base_src_loop:<udpsrc3> error: Internal data flow error.
0:00:00.353602076 13560 0x23f5540 WARN basesrc gstbasesrc.c:2948:gst_base_src_loop:<udpsrc3> error: streaming task paused, reason not-linked (-1)
0:00:02.177975961 13560 0x23f2ed0 WARN x264enc :0::<x264enc0> VBV underflow (frame 298, -14405 bits)
0:00:02.338993437 13560 0x23f2ed0 WARN x264enc :0::<x264enc0> VBV underflow (frame 328, -4872 bits)
如何解决?
当我用 fakesink 替换 selector.sink_0 时,RTSP 流被正常记录。显然问题是由切换流引起的。
解决方案
推荐阅读
- flutter - 使用 BLoC 模式和 StatelessWidget 时如何调用 dispose
- php - 在 PHP 中使用 eval() 实现 __toString()
- vb.net - 尝试通过查询数据上下文返回键/值对时无法转换对象错误
- android - 如何修复 Android 8 中损坏的意图过滤器
- google-cloud-iot - 谷歌云物联网核心证书
- android - 构建项目:outOfMemory (Android studio 3.4)
- javascript - 刷新SetInterval js
- hibernate - Hibernate 生成不正确的查询
- sql - 使用内连接选择出现次数最多的 SQL
- java - 用 dropwizard 编写的简单 todo 应用后端 api 产生 500 错误