如何解决如何使用 Gstreamer 将实时音频和视频混合到 mpegts?
目标:
在 Raspberry Pi 上,从连接的摄像头和麦克风获取输入,合并为单个流,使用 VLC 应用跨网络播放。
更多详情:
我正在尝试使用 Raspberry Pi Zero W、USB 麦克风和通过 Pi 的摄像头端口连接的摄像头制作相当于 IP 摄像头的东西。
这个想法是让实时音频和视频只能在我的本地网络上从任何可以运行 VLC 播放器的设备上查看。
视频正在播放
我决定使用 Gstreamer 的命令行工具来构建此应用程序,因为据报道,它比使用 cvlc
或 ffmpeg
之类的工具具有更低的延迟。
我已经根据 this link 中的代码构建了一个仅用于视频的工作管道。
#!/bin/bash
dstAdr=${1:-192.168.0.255}
raspivid -n -w 640 -h 480 -fps 20 -b 2000000 -a 12 -t 0 -o - \
| gst-launch-1.0 -v fdsrc \
! video/x-h264,width=640,height=480,framerate=20/1 \
! h264parse config-interval=-1 \
! mpegtsmux \
! udpsink host=$dstAdr port=5004
通过在 VLC 中打开网络流 udp://@:5004
,可以从我的 PC 和智能手机查看此流。
如何包含音频?
我有一个 USB 麦克风,我想用它来捕获实时音频并将其包含在 MPEG 流中。我已通过从麦克风录制短片并在我的 PC 上播放文件来确认麦克风可以运行。
根据 this answer 处 Gstreamer 多路复用器的描述,我创建了以下管道以尝试将音频包含在流中:
raspivid -n -w 640 -h 480 -fps 20 -b 2000000 -a 12 -t 0 -o - \
| gst-launch-1.0 -e -v fdsrc \
! video/x-h264,framerate=20/1 \
! h264parse config-interval=-1 \
! mpegtsmux name=mux \
! rtpmp2tpay \
! udpsink host=$dstAdr port=5004 \
alsasrc device=hw:1,0 \
! audio/x-raw,channels=1,rate=44100 \
! queue \
! lamemp3enc \
! mux.
麦克风只有 1 个通道,并且速率也经过了双重检查。 管道不会立即抛出错误消息,但其他设备上的 VLC 无法播放流。 一段时间后,显示此错误消息:
ERROR: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Internal data stream error.
Additional debug info:
gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:
streaming stopped,reason not-negotiated (-4)
EOS on shutdown enabled -- waiting for EOS after Error
Waiting for EOS...
ERROR: from element /GstPipeline:pipeline0/GstQueue:queue0: Internal data stream error.
Additional debug info:
gstqueue.c(988): gst_queue_handle_sink_event (): /GstPipeline:pipeline0/GstQueue:queue0:
streaming stopped,reason not-negotiated (-4)
问题
- 是否有其他选项需要明确包含在
alsasrc
中? - 是否可以使用 Gstreamer 命令行工具将两个实时提要混合到一个流中?
- 是否可以使用 Gstreamer C API 执行此操作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。