使用 ffenc_aac 对音频文件进行编码

0 gstreamer

我正在尝试使用 gstreamer 对音频文件进行编码。我正在使用命令

gst launch filesrc location=s.pcm ! audio/x-raw-int, rate=4000, channels=2, endianness=1234, width=16, depth=16, signed=true ! ffenc_aac ! filesink location=file.wav
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:-

将管道设置为暂停...管道正在预滚动...错误:来自元素 /GstPipeline:pipeline0/GstFileSrc:filesrc0:内部数据流错误。其他调试信息:gstbasesrc.c(2625):gst_base_src_loop():/GstPipeline:pipeline0/GstFileSrc:filesrc0:流任务已暂停,原因未协商(-4)错误:管道不想预卷。将管道设置为 NULL ...正在释放管道...

谁能指导我解决这个问题

Jos*_*itt 5

不要将编码与容器混淆。您不能拥有 AAC 编码的 WAV,WAV 是 PCM。您可以拥有 4k WAV,也可以拥有 MP4 或 M4A 容器中的 AAC 编码文件。这两个例子如下。请注意,在这些示例中,如果您尝试将采样率更改为低于 48000,AAC 编码器会变得非常挑剔。

创建原始音频文件

gst-launch audiotestsrc num-buffers=100 \
! audio/x-raw-int, rate=48000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! filesink location=foo.pcm
Run Code Online (Sandbox Code Playgroud)

将其编码为 WAV

gst-launch filesrc location=foo.pcm \
! audio/x-raw-int, rate=48000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! audioresample \
! audio/x-raw-int, rate=4000 \
! wavenc \
! filesink location=foo.wav
Run Code Online (Sandbox Code Playgroud)

将其编码为 AAC 并复用为 mp4

真的不知道为什么我必须编码然后再次解码,但没有其他任何工作,即使我可以直接从audiotest src进入。

gst-launch filesrc location=foo.pcm \
! audio/x-raw-int, rate=48000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! wavenc \
! wavparse \
! ffenc_aac \
! mp4mux \
! filesink location=foo.mp4
Run Code Online (Sandbox Code Playgroud)

..交替使用 faac

管道更干净,输出文件更小

gst-launch filesrc location=foo.pcm \
! audio/x-raw-int, rate=48000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! faac \
! mp4mux \
! filesink location=foo.mp4
Run Code Online (Sandbox Code Playgroud)

或 voaacenc

voaacenc 在低于 48000 时无法工作,尽管它看起来具有最灵活的功能。我尝试了 8k、16k、48k、96k 和 44100,这些都改变了测试音的音高。

gst-launch filesrc location=foo.pcm \
! audio/x-raw-int, rate=48000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! voaacenc \
! mp4mux \
! filesink location=foo.mp4
Run Code Online (Sandbox Code Playgroud)

低码率AAC

我成功使用的最低 AAC 比特率是 16000,以下是这些测试,再次指出 faac 生成的文件大小最小。

gst-launch audiotestsrc num-buffers=100 \
! audio/x-raw-int, rate=16000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! ffenc_aac \
! mp4mux \
! filesink location=foo.mp4

gst-launch audiotestsrc num-buffers=100 \
! audio/x-raw-int, rate=16000, channels=2, endianness=1234, width=16, depth=16, signed=true \
! faac \
! mp4mux \
! filesink location=foo.mp4 
Run Code Online (Sandbox Code Playgroud)