Audio 在不同情况下播放多声道音频时出错?

Audio 在不同情况下播放多声道音频时出错?,audio,gstreamer,alsa,Audio,Gstreamer,Alsa,我尝试播放两个频道,其中一个频道播放音频,另一个频道播放静音 $ gst-launch \ interleave name=i ! alsasink filesrc location=/home/test1.mp3 \ ! decodebin ! audioconvert \ ! audio/x-raw-int,channels=1 ! i. \ audiotestsrc wave=silence \ ! decodebin

我尝试播放两个频道,其中一个频道播放音频,另一个频道播放静音

$ gst-launch \
    interleave name=i ! alsasink
    filesrc location=/home/test1.mp3 \
        ! decodebin ! audioconvert \
        ! audio/x-raw-int,channels=1 ! i. \
    audiotestsrc wave=silence \
        ! decodebin ! audioconvert \
        ! audio/x-raw-int,channels=1 ! volume volume=1.0 ! i.
10秒后,我想在第一个频道播放静音,在第二个频道播放一些音频

$ gst-launch \
    interleave name=i ! alsasink \
    audiotestsrc wave=silence \
        ! decodebin ! audioconvert \
        ! audio/x-raw-int,channels=1 ! i. \
    filesrc location=/home/test2.mp3 \
        ! decodebin ! audioconvert \
        ! audio/x-raw-int,channels=1 ! volume volume=1.0 ! i.
这可以在PC端完成,同时在两个不同的终端上播放这些管道,或者让其中一个在后台运行。但当我在am335x板上播放一条管道并尝试播放另一条管道时,它是这样的:

Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstAlsaSink:alsasink0: Could not open audio device for playback. 
Device is being used by another application.
Additional debug info:
gstalsasink.c(697): gst_alsasink_open (): /GstPipeline:pipeline0/GstAlsaSink:alsasink0:
Device 'default' is busy
Setting pipeline to NULL ...
Freeing pipeline ...
当我们签入gstalsasink.c时,它正在以非阻塞模式调用snd_pcm_open

CHECK (snd_pcm_open (&alsa->handle, alsa->device, SND_PCM_STREAM_PLAYBACK,
      SND_PCM_NONBLOCK), open_error);
那么为什么要阻止其他事件来使用音频设备呢


有人能建议我如何处理目标端吗,因为PC端ALASINK是完美的。

在嵌入式硬件上关闭alsa设备是否会有一点延迟。与fuser一起检查哪个进程仍处于打开状态。还考虑使用GNONLIN来开发流的顺序回放。这将重用现有的音频接收器。

gnonlin将无法满足我的要求,因为在实时场景中,不确定在什么时间之后,应该播放第二条管道。这是一种随机的情况,可能需要使用静音通道来播放另一个音频。在PC端使用相同的管道,同时在目标板上抛出错误,这有多好。好吧,所以这个用例更像是一个广播流,你想在其中过度播放一条公告?是的。这就像第一个频道只播放一个音频,而我们想在第二个频道上开始另一条直到现在都没有声音的公告,然后我得到的错误是“设备忙”。从alsasink hw访问处于非阻塞模式。从驱动程序方面看,如何在非阻塞模式下检查其打开。在这种情况下,在alsa方面使用dmix或在gstreamer方面使用一个alsasink实例,在gstreamer管道内使用加法器混合流。