下午好,到目前为止,我一直在使用gstreamer来流式传输8声道的音频,没有任何问题。我在audacity中生成了8个单声道,并导出了一个wav文件。
我最近被要求支持16个频道,我惊讶地发现16个频道(或8个以上的任何频道)不被支持。用于流式传输wav文件的命令行gstreamer命令如下所示:
GST_DEBUG=3 gst-launch-1.0 filesrc location=~/Desktop/8ch_16_test_diagwav.wav ! decodebin ! audioconvert ! audioresample ! audioconvert ! audio/x-raw,format=S16BE,rate=48000,channels=16 ! filesink location=/tmp/filesink0当使用16通道文件运行时,我得到以下错误:
Setting pipeline to PAUSED ...
0:00:00.041995106 3534 0x55b0024a4e10 WARN basesrc gstbasesrc.c:3583:gst_base_src_start_complete:<filesrc0> pad not activated yet
Pipeline is PREROLLING ...
0:00:00.046842761 3534 0x7f833806ec00 FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:<wavparse0:src> Creating random stream-id, consider implementing a deterministic way of creating a stream-id
0:00:00.091236225 3534 0x7f833806ec00 WARN audio-resampler audio-resampler.c:274:convert_taps_gint16_c: can't find exact taps
0:00:00.091319797 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
0:00:00.091329274 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091339971 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091344101 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091356433 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
0:00:00.091398546 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
0:00:00.091404430 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091411526 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091415084 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091423006 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
0:00:00.091461862 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
0:00:00.091467389 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091473940 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091477330 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091484711 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
0:00:00.091521324 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
0:00:00.091526722 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091533191 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091536562 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091543448 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
0:00:00.091554349 3534 0x7f833806ec00 WARN wavparse gstwavparse.c:2293:gst_wavparse_loop:<wavparse0> error: Internal data stream error.
0:00:00.091558663 3534 0x7f833806ec00 WARN wavparse gstwavparse.c:2293:gst_wavparse_loop:<wavparse0> error: streaming stopped, reason not-negotiated (-4)
ERROR: from element /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstWavParse:wavparse0: Internal data stream error.
Additional debug info:
gstwavparse.c(2293): gst_wavparse_loop (): /GstPipeline:pipeline0/GstDecodeBin:decodebin0/GstWavParse:wavparse0:
streaming stopped, reason not-negotiated (-4)
0:00:00.091614021 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
0:00:00.091619464 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091662384 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091681343 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091701845 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
0:00:00.091767321 3534 0x7f833806ec00 WARN audioconvert gstaudioconvert.c:654:gst_audio_convert_fixate_channels:<audioconvert1> invalid or unexpected channel-positions
0:00:00.091773142 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:668:gst_audio_convert_fixate_channels:<audioconvert1> Have no default layout for 16 channels
0:00:00.091779617 3534 0x7f833806ec00 ERROR audio-info audio-info.c:304:gst_audio_info_from_caps: no channel-mask property given
0:00:00.091797568 3534 0x7f833806ec00 ERROR audioconvert gstaudioconvert.c:778:gst_audio_convert_set_caps:<audioconvert1> invalid output caps
0:00:00.091805352 3534 0x7f833806ec00 WARN basetransform gstbasetransform.c:1362:gst_base_transform_setcaps:<audioconvert1> FAILED to configure incaps audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)8, channel-mask=(bitmask)0x0000000000000c3f, rate=(int)48000 and outcaps audio/x-raw, layout=(string)interleaved, rate=(int)48000, format=(string)S16BE, channels=(int)16
Freeing pipeline ...当将8channel文件和channel =8与从同一audacity项目生成的wav文件一起使用时,一切正常。
目前,使用
linux
gst-launch-1.0 version 1.14.4
GStreamer 1.14.4是不是根本不可能在命令行中使用gstreamer流式传输一个16通道的wav文件?我试着查看各种标志,如交错,通道位置等,但没有足够的经验,不知道可能需要什么。
任何帮助或链接都将受到欢迎。
发布于 2020-05-12 04:23:22
也许在Audacity方面出了什么问题?
下面的代码为我创建了一个16通道.wav文件:
gst-launch-1.0 audiotestsrc is-live=true ! \
audio/x-raw,format=S16BE,rate=48000,channels=16 ! \
audioresample ! audioconvert ! wavenc ! filesink location=x.wavffprobe:
Input #0, wav, from 'x.wav':
Duration: 00:23:18.06, bitrate: 24 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 16 channels, s16, 12288 kb/s该文件也可以在gst-play-1.0 x.wav上正常播放。这些都在GStreamer 1.16.2上。
发布于 2020-05-13 15:54:31
经过相当多的搜索和实验,我终于找到了一个可行的解决方案。
gst-launch-1.0 filesrc location=16ch_16bit_10s.wav ! decodebin ! capssetter caps="audio/x-raw,channels=16,rate=48000,channel-mask=(bitmask)0xffff" ! audioconvert ! audioresample ! "audio/x-raw,rate=48000,format=S16BE" ! queue ! capssetter caps="audio/x-raw,channels=16,rate=48000,channel-mask=(bitmask)0xffff" ! audioconvert ! audioresample ! filesink location=audiosink其中位掩码值=(2^通道)-1,采用十六进制字符串格式。
这主要是通过跟踪和错误发现的,使用以下内容作为参考:interleaving 4 channels of audio into vorbisenc or opusenc in gstreamer
不幸的是,我没有足够的经验(或足够聪明)来完全理解为什么这样做是可行的。capsetter实际上是做什么的,为什么上游和下游之间需要一个"audio/x-raw,rate=48000,format=S16BE",这是任何人都不知道的。如果有人能编辑/评论一个更好的解释可能会更好?
有了这个解决方案,我可以在16-24位和1,2,4,8,16通道之间切换。
https://stackoverflow.com/questions/61728296
复制相似问题