存储 AAC 音频和检索
Storing AAC Audio and Retrieving
我想存储一个包含 AAC 音频帧的文件,
为此我使用了下面的管道,
gst-launch-1.0 filesrc location=Test_44100Hz_2ch_s16le.wav ! "audio/x-raw,rate=44100,format=s16le,channels=2" ! audioparse format=raw raw-format=s16le rate=44100 channels=2 ! faac ! aacparse ! queue ! filesink location=a1
使用以下管道再次将该文件读取到 pulsesink 时,
gst-launch-1.0 filesrc location=a1 ! aacparse ! faad ! audioconvert ! audioresample ! pulsesink
我收到以下错误,我使用了 GST_DEBUG=3,但我找不到解决方案。
0:00:00.031924804 3379 0x2231d60 WARN basesrc gstbasesrc.c:3483:gst_base_src_start_complete:<filesrc0> pad not activated yet
Pipeline is PREROLLING ...
0:00:00.033044700 3379 0x2231050 WARN baseparse gstbaseparse.c:3255:gst_base_parse_loop:<aacparse0> error: No valid frames found before end of stream
ERROR: from element /GstPipeline:pipeline0/GstAacParse:aacparse0: No valid frames found before end of stream
Additional debug info:
gstbaseparse.c(3255): gst_base_parse_loop (): /GstPipeline:pipeline0/GstAacParse:aacparse0
ERROR: pipeline doesn't want to preroll.
谁能帮我解决这个问题?我需要存储 AAC 音频帧并需要将该文件作为 AAC 音频流进行流式传输。
就是这样,测试有效:
gst-launch-1.0 filesrc location=WAV_44_16bit.wav ! decodebin ! audioconvert ! queue ! voaacenc ! aacparse ! queue ! mp4mux ! filesink location=aac.mp4
gst-launch-1.0 filesrc location=aac.mp4 ! decodebin ! audioconvert ! audioresample ! alsasink
在容器中存储了元数据信息。没有它们解码器不知道如何处理数据。
AAC 音频流需要一个容器才能在 gstreamer 中发挥作用
对于解码器初始化,有必要知道采样频率和音频 Object。在 gstreamer 中,我们无法将此元数据直接传递给解析器或解码器。解析器从 mp4 header 收集此数据,然后编码器继承帧 structure/size 和采样率。因此,这是 aacparse(parser) 或 avdec_aac/faad(decoder) 的缺陷,其中 none 公开了参数来指定原始文件的帧大小,即上述元数据。话虽如此,我还没有找到任何人需要这样做的令人信服的理由。在我发现 aac 只需要混合到 MP4(mp4mux) 或另一个容器中才能工作和便携之前,我发现自己尝试这样做。 container/framing 仅向流中添加少量数据。
我想存储一个包含 AAC 音频帧的文件,
为此我使用了下面的管道,
gst-launch-1.0 filesrc location=Test_44100Hz_2ch_s16le.wav ! "audio/x-raw,rate=44100,format=s16le,channels=2" ! audioparse format=raw raw-format=s16le rate=44100 channels=2 ! faac ! aacparse ! queue ! filesink location=a1
使用以下管道再次将该文件读取到 pulsesink 时,
gst-launch-1.0 filesrc location=a1 ! aacparse ! faad ! audioconvert ! audioresample ! pulsesink
我收到以下错误,我使用了 GST_DEBUG=3,但我找不到解决方案。
0:00:00.031924804 3379 0x2231d60 WARN basesrc gstbasesrc.c:3483:gst_base_src_start_complete:<filesrc0> pad not activated yet
Pipeline is PREROLLING ...
0:00:00.033044700 3379 0x2231050 WARN baseparse gstbaseparse.c:3255:gst_base_parse_loop:<aacparse0> error: No valid frames found before end of stream
ERROR: from element /GstPipeline:pipeline0/GstAacParse:aacparse0: No valid frames found before end of stream
Additional debug info:
gstbaseparse.c(3255): gst_base_parse_loop (): /GstPipeline:pipeline0/GstAacParse:aacparse0
ERROR: pipeline doesn't want to preroll.
谁能帮我解决这个问题?我需要存储 AAC 音频帧并需要将该文件作为 AAC 音频流进行流式传输。
就是这样,测试有效:
gst-launch-1.0 filesrc location=WAV_44_16bit.wav ! decodebin ! audioconvert ! queue ! voaacenc ! aacparse ! queue ! mp4mux ! filesink location=aac.mp4
gst-launch-1.0 filesrc location=aac.mp4 ! decodebin ! audioconvert ! audioresample ! alsasink
在容器中存储了元数据信息。没有它们解码器不知道如何处理数据。
AAC 音频流需要一个容器才能在 gstreamer 中发挥作用
对于解码器初始化,有必要知道采样频率和音频 Object。在 gstreamer 中,我们无法将此元数据直接传递给解析器或解码器。解析器从 mp4 header 收集此数据,然后编码器继承帧 structure/size 和采样率。因此,这是 aacparse(parser) 或 avdec_aac/faad(decoder) 的缺陷,其中 none 公开了参数来指定原始文件的帧大小,即上述元数据。话虽如此,我还没有找到任何人需要这样做的令人信服的理由。在我发现 aac 只需要混合到 MP4(mp4mux) 或另一个容器中才能工作和便携之前,我发现自己尝试这样做。 container/framing 仅向流中添加少量数据。