ALSA dsnoop 导致 GStreamer 视频出现问题
ALSA dsnoop causes issue with GStreamer video
我正在使用 GStreamer 从带有 picam 模块和 USB 麦克风的 Pi3B 流式传输实时视频/音频。我的最终目标是在实时视频/音频流中使用来自一个 USB 麦克风的音频,并将其作为 python 脚本的输入。我知道这可以用 ALSA dsnoop 插件来完成,并且已经能够用这个 /etc/asound.conf 配置来证明它:
pcm.myTest {
type dsnoop
ipc_key 2241234
slave {
pcm "hw:1,0"
channels 1
}
}
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "myTest"
}
}
视频/音频流使用以下 GStreamer 设置完美运行,但我无法在其他应用程序中使用麦克风(注意“hw:1,0”):
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=hw:1,0 \
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
以下内容(使用 dsnoop)导致视频流出现问题,这看起来像是某种同步问题,而不是每秒 24 帧的流畅画面,我每 ~2-3 秒得到一帧。音频继续正常工作,无法在其他应用程序中同时使用 USB 麦克风。
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=plug:myTest \
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
我已经尝试了一些我在一些外围相关论坛中发现的东西,但都无济于事,我感觉有点卡住了。你们有什么建议可以让流与 dsnoop 很好地播放,这样我就可以避免为这个项目购买另一个麦克风吗?
谢谢!
为了后代,我从 GStreamer developer forum 那里收到了一个很好的提示。
将 provide-clock=false
添加到 alsasrc 行就成功了!所以 GStreamer 调用变为:
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=plug:myTest provide-clock=false\
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
这种方法的一个小副作用是音频是
与视频不同步约 0.5 秒。我很想知道是否有办法更好地同步两者,或者这是否只是其中之一
尝试将 dsnoop 设备与 gstreamer 一起使用时不可避免的权衡?
我正在使用 GStreamer 从带有 picam 模块和 USB 麦克风的 Pi3B 流式传输实时视频/音频。我的最终目标是在实时视频/音频流中使用来自一个 USB 麦克风的音频,并将其作为 python 脚本的输入。我知道这可以用 ALSA dsnoop 插件来完成,并且已经能够用这个 /etc/asound.conf 配置来证明它:
pcm.myTest {
type dsnoop
ipc_key 2241234
slave {
pcm "hw:1,0"
channels 1
}
}
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "myTest"
}
}
视频/音频流使用以下 GStreamer 设置完美运行,但我无法在其他应用程序中使用麦克风(注意“hw:1,0”):
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=hw:1,0 \
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
以下内容(使用 dsnoop)导致视频流出现问题,这看起来像是某种同步问题,而不是每秒 24 帧的流畅画面,我每 ~2-3 秒得到一帧。音频继续正常工作,无法在其他应用程序中同时使用 USB 麦克风。
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=plug:myTest \
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
我已经尝试了一些我在一些外围相关论坛中发现的东西,但都无济于事,我感觉有点卡住了。你们有什么建议可以让流与 dsnoop 很好地播放,这样我就可以避免为这个项目购买另一个麦克风吗?
谢谢!
为了后代,我从 GStreamer developer forum 那里收到了一个很好的提示。
将 provide-clock=false
添加到 alsasrc 行就成功了!所以 GStreamer 调用变为:
#!/bin/bash
gst-launch-1.0 -v rpicamsrc vflip=true hflip=false \
name=src preview=0 fullscreen=0 bitrate=10000000 \
annotation-mode=time annotation-text-size=20 \
! video/x-h264,width=960,height=540,framerate=24/1 \
! h264parse \
! rtph264pay config-interval=1 pt=96 \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5001 \
alsasrc device=plug:myTest provide-clock=false\
! audioconvert \
! audioresample \
! opusenc \
! rtpopuspay \
! queue max-size-bytes=0 max-size-buffers=0 \
! udpsink host=192.168.1.101 port=5002
这种方法的一个小副作用是音频是 与视频不同步约 0.5 秒。我很想知道是否有办法更好地同步两者,或者这是否只是其中之一 尝试将 dsnoop 设备与 gstreamer 一起使用时不可避免的权衡?