我想存储一个有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
使用以下管道再次读取该文件时,
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音频流传输。
答案 0 :(得分:0)
这是经过测试的工作:
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
在容器中存储元数据信息..没有它们,解码器不知道如何处理数据。
答案 1 :(得分:0)
AAC音频流需要一个容器才能在gstreamer中有用
对于解码器初始化,有必要知道采样频率和音频对象。在gstreamer中,我们无法将此元数据直接传递给解析器或解码器。解析器从mp4头中收集此数据,然后编码器继承帧结构/大小和采样率。因此,这是aacparse(解析器)或avdec_aac / faad(解码器)中的缺陷,其中没有一个具有公开的参数来指定原始文件的帧大小,前面提到的元数据。话虽如此,我还没有找到令人信服的理由,为什么有人需要这样做。在我发现aac只需要复制到MP4(mp4mux)或其他容器中工作并可移植之前,我发现自己试图这样做。容器/框架只向流添加少量数据。