gpt4 book ai didi

c++ - 强制 gstreamer appsink 缓冲区只保存 10ms 的数据

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:19 25 4
gpt4 key购买 nike

我有一个 gstreamer 管道,它将其所有数据放入一个应用接收器中:

command = g_strdup_printf ("autoaudiosrc ! audio/x-raw-int, signed=true, endianness=1234, depth=%d, width=%d, channels=%d, rate=%d !"
" appsink name=soundSink max_buffers=2 drop=true ",
bitDepthIn, bitDepthIn, channelsIn, sampleRateIn);

通常看起来像,

autoaudiosrc ! audio/x-raw-int, signed=true, endianness=1234, depth=16, width=16, channels=1, rate=16000 ! appsink name=soundSink max_buffers=2 drop=true

在运行时。

它可以很好地捕获音频,问题是它倾向于捕获它想要的任意数量的随机数据,而不是设置的大小或时间间隔。因此,例如,请求数据的 rtp 库只会请求 960 字节(10ms of 48khz/1 1channel/16 bit depth),但缓冲区的长度将从 10ms 到 26ms 不等。非常重要的是,此管道每个缓冲区仅返回 10 毫秒。有没有办法做到这一点?这是抓取数据的代码。

void GSTMediaStream::GetAudioInputData(void* data, int max_size, int& written)
{
if (soundAppSink != NULL)
{
GstBuffer* buffer = gst_app_sink_pull_buffer (GST_APP_SINK (soundAppSink));
if (buffer)
{
uint bufSize = MIN (GST_BUFFER_SIZE (buffer), max_size);
uint offset = 0;

std::cout << "buffer time length is " << GST_BUFFER_DURATION(buffer) << "ns buffer size is " << GST_BUFFER_SIZE (buffer)
<< " while max size is " << max_size << "\n";
//if max_size is smaller than the buffer, then only grab the last 10ms captured.
//I am assuming that the reason for the occasional difference is because the buffers are larger
//in the amount of audio frames than the rtp stream wants.
if(bufSize > 0)
uint offset = GST_BUFFER_SIZE (buffer)- bufSize;

memcpy (data, buffer->data + offset, bufSize);
written = bufSize;
gst_buffer_unref(buffer);
}
}
}

更新好的,所以我已经将问题缩小到 gstreamer 的脉冲音频插件。 autoaudiosrc 使用 pulsesrc 插件进行捕获,无论出于何种原因,脉冲服务器在几次重采样后速度变慢。我用 alsasrc 进行了测试,它似乎可以在保持 10 毫秒缓冲区的同时处理采样率变化,但问题是它不允许我以单声道捕捉音频:只能以立体声捕捉。

最佳答案

我去掉了 autoaudiosrc 并插入了 alsasrc。 pulsesrc 插件是导致缓冲区拉动不稳定的阻塞行为的原因,这给了我不同的缓冲区长度。唯一的问题是 alsasrc 不会在单声道中捕获。我通过在管道中添加 audioconvert 元素来解决这个问题。我的最后一根 pipe 是:

alsasrc ! audioconvert ! audio/x-raw-int, signed=true, endianness=1234, depth=16, width=16, channels=1, rate=16000 ! appsink name=soundSink max_buffers=2 drop=true

这给了我所需的缓冲区长度。但是,这是否会给我带来任何重大的性能问题,因为这将在嵌入式设备上进行?

关于c++ - 强制 gstreamer appsink 缓冲区只保存 10ms 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com