Audio 使用gstreamer将原始音频转换为ogg

Audio 使用gstreamer将原始音频转换为ogg,audio,gstreamer,Audio,Gstreamer,以下管道生成一个3kb.ogg文件(我假设它只是一个空容器): 以下是调试输出: Setting pipeline to PAUSED ... Pipeline is PREROLLING ... Redistribute latency... 0:00:00.048490941 813 0x556bf3625000 FIXME basesink gstbasesink.c:3077:gst_base_sink_default_event:<filesink

以下管道生成一个3kb.ogg文件(我假设它只是一个空容器):

以下是调试输出:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
0:00:00.048490941   813 0x556bf3625000 FIXME               basesink gstbasesink.c:3077:gst_base_sink_default_event:<filesink0> stream-start event without group-id. Consider implementing group-id handling in the upstream elements
0:00:00.048541997   813 0x556bf3625000 WARN            audioencoder gstaudioencoder.c:985:gst_audio_encoder_finish_frame:<vorbisenc0> Can't copy metadata because input buffer disappeared
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.139954729   813 0x556bf3625000 WARN                 basesrc gstbasesrc.c:2400:gst_base_src_update_length:<filesrc0> processing at or past EOS
Got EOS from element "pipeline0".
Execution ended after 0:00:00.091883401
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
0:00:00.135676651   822 0x562b3cd64770 FIXME               basesink gstbasesink.c:3077:gst_base_sink_default_event:<filesink0> stream-start event without group-id. Consider implementing group-id handling in the upstream elements
0:00:00.135718946   822 0x562b3cd64770 WARN            audioencoder gstaudioencoder.c:985:gst_audio_encoder_finish_frame:<vorbisenc0> Can't copy metadata because input buffer disappeared
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.219188746   822 0x562b3cd64770 WARN                  wavenc gstwavenc.c:795:gst_wavenc_write_toc:<wavenc0> have no toc
Got EOS from element "pipeline0".
Execution ended after 0:00:00.083921991
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
调试输出:

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
0:00:00.048490941   813 0x556bf3625000 FIXME               basesink gstbasesink.c:3077:gst_base_sink_default_event:<filesink0> stream-start event without group-id. Consider implementing group-id handling in the upstream elements
0:00:00.048541997   813 0x556bf3625000 WARN            audioencoder gstaudioencoder.c:985:gst_audio_encoder_finish_frame:<vorbisenc0> Can't copy metadata because input buffer disappeared
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.139954729   813 0x556bf3625000 WARN                 basesrc gstbasesrc.c:2400:gst_base_src_update_length:<filesrc0> processing at or past EOS
Got EOS from element "pipeline0".
Execution ended after 0:00:00.091883401
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Redistribute latency...
0:00:00.135676651   822 0x562b3cd64770 FIXME               basesink gstbasesink.c:3077:gst_base_sink_default_event:<filesink0> stream-start event without group-id. Consider implementing group-id handling in the upstream elements
0:00:00.135718946   822 0x562b3cd64770 WARN            audioencoder gstaudioencoder.c:985:gst_audio_encoder_finish_frame:<vorbisenc0> Can't copy metadata because input buffer disappeared
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.219188746   822 0x562b3cd64770 WARN                  wavenc gstwavenc.c:795:gst_wavenc_write_toc:<wavenc0> have no toc
Got EOS from element "pipeline0".
Execution ended after 0:00:00.083921991
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
正在将管道设置为暂停。。。
管道正在预滚。。。
重新分配延迟。。。
0:00:0.135676651 822 0x562B3CD64 770 FixMe BaseSink GStBaseSink .C: 3077:GSTYBaseSHIKO-DEFAUTTHEL事件:没有GROUP ID的流启动事件。考虑在上游元素中实现组ID处理
0:00:00.135718946 822 0x562b3cd64770警告音频编码器gstaudioencoder.c:985:gst\U音频编码器\U完成\U帧:无法复制元数据,因为输入缓冲区消失
管道已预卷。。。
正在将管道设置为播放。。。
新时钟:GstSystemClock
0:00:00.219188746 822 0x562b3cd64770 WARN wavenc gstwavenc.c:795:gst\U wavenc\U write\U toc:无toc
从元素“pipeline0”获取EOS。
执行在0:00:00.083921991后结束
正在将管道设置为暂停。。。
正在将管道设置为就绪。。。
正在将管道设置为空。。。
释放管道。。。

所以我的问题是:第二条管道是什么,有了wavenc!wavparse,前提是缺少第一个表单,是否有更直接的方法来指定它,或者第二个表单实际上是“正确”的方法?

第一个管道很好,因为它与testaudiosrc(audio/x-raw-int)一起工作 我假设您的未压缩音频文件必须是未压缩的WAV文件 Wavenc可能正在预处理LPCM,并转换为vorbisenc可以使用的东西。我怀疑vorbisenc的数据宽度需要是32或64,这可能是最重要的

PCM有符号16位小端数(S16LE)>
音频转换-将音频转换为不同格式(输入:音频/x-raw-int输出:音频/x-raw-int)
wavenc-将原始音频编码为WAV(输入:音频/x-raw-int输出:音频/x-WAV)
wavparse-将.wav文件解析为原始音频(输入:音频/x-wav输出:音频/x-raw-float宽度:{32,64})
vorbisenc-以Vorbis格式对音频进行编码(in:audio/x-raw-float out:audio/x-Vorbis)

附录:我下载了你的文件,并且能够确认你正在进行未实现的从16位到32位的流转换。Vorbisenc仅接受32位宽度。要回答您最初的问题,不,您不需要WAV解析。这是您正在寻找的高效管道,简化了宽度转换

gst-launch --gst-debug=2 filesrc location=test.raw \
! audio/x-raw-int, width=16, channels=2, depth=16, rate=16000, endianness=1234, signed=true \
! audioconvert \
! audio/x-raw-float, width=32, channels=2, rate=16000, endianness=1234, signed=true \
! vorbisenc \
! oggmux \
! filesink location=test.ogg

第一条管道很好,因为它与testaudiosrc(audio/x-raw-int)一起工作 我假设您的未压缩音频文件必须是未压缩的WAV文件 Wavenc可能正在预处理LPCM,并转换为vorbisenc可以使用的东西。我怀疑vorbisenc的数据宽度需要是32或64,这可能是最重要的

PCM有符号16位小端数(S16LE)>
音频转换-将音频转换为不同格式(输入:音频/x-raw-int输出:音频/x-raw-int)
wavenc-将原始音频编码为WAV(输入:音频/x-raw-int输出:音频/x-WAV)
wavparse-将.wav文件解析为原始音频(输入:音频/x-wav输出:音频/x-raw-float宽度:{32,64})
vorbisenc-以Vorbis格式对音频进行编码(in:audio/x-raw-float out:audio/x-Vorbis)

附录:我下载了你的文件,并且能够确认你正在进行未实现的从16位到32位的流转换。Vorbisenc仅接受32位宽度。要回答您最初的问题,不,您不需要WAV解析。这是您正在寻找的高效管道,简化了宽度转换

gst-launch --gst-debug=2 filesrc location=test.raw \
! audio/x-raw-int, width=16, channels=2, depth=16, rate=16000, endianness=1234, signed=true \
! audioconvert \
! audio/x-raw-float, width=32, channels=2, rate=16000, endianness=1234, signed=true \
! vorbisenc \
! oggmux \
! filesink location=test.ogg

它实际上是一个原始数据流(我实际上是在尝试将原始数据流通过管道传输到icecast服务器)。我尝试wavenc/wavparse的原因只是我认为wav文件基本上是一种原始格式,也许将其转换为wav会使其工作(它工作了,但我不知道为什么)。我认为缺少了一些元数据,但您关于数据宽度的观点更有意义。几天后我才能访问流媒体服务器,一旦我可以验证,我会将您的响应标记为答案。您可以发布文件或其中的一部分吗?我很好奇,想尝试一些测试。抱歉还没有确认。。。最近几天我的日程安排有点疯狂。这里是一个示例原始文件:通过示例确认,请参阅附录。它实际上是一个原始数据流(我实际上是在尝试将原始数据流传输到icecast服务器)。我尝试wavenc/wavparse的原因只是我认为wav文件基本上是一种原始格式,也许将其转换为wav会使其工作(它工作了,但我不知道为什么)。我认为缺少了一些元数据,但您关于数据宽度的观点更有意义。几天后我才能访问流媒体服务器,一旦我可以验证,我会将您的响应标记为答案。您可以发布文件或其中的一部分吗?我很好奇,想尝试一些测试。抱歉还没有确认。。。最近几天我的日程安排有点疯狂。这里有一个原始文件示例:已通过示例确认,请参见附录。