- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 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/
我正在使用 gstreamer 1.0 编写一个 C 应用程序 我正在将 alsa 音频源录制到 appsink 中,以便解析数据并稍后显示图表。 create_loop() 函数在初始化 gst_i
我正在使用 gstreamer-1.0 编写一个简单的应用程序,我想接收通过管道流回我的应用程序的缓冲区。为此,我在管道末端使用了 appsink 插件。 到现在为止,一切正常,但是当我想接收缓冲区时
我正在设计一个管道,将来自 opencv 应用程序(从网络摄像头获取)的视频帧编码为视频/x-h264 格式,通过网络发送并在另一个不同类型的设备(可能是树莓派)上解码) 到适合我的项目的 RGB 流
我使用 Gstreamer 1.0 设置了一个简单的管道,如下所示。当我尝试从 appsink 创建拉样本时,代码停在 "sample = appsink.emit('pull-sample')"处。
这将是我第一次在 C 程序中使用 Gstreamer。我只使用过管道。我正在尝试编写一个程序,该程序将流存储在缓冲区中,使用 OpenCv 编辑流并使用带有 appsrc 的管道来查看流。我收到错误:
我已经为 appsrc 编写了一个代码到 appsink 并且它可以工作。我看到了实际的缓冲区。它以 H264(vpuenc=avc) 编码。现在我想把它保存在一个文件(filesink)中。我如何处
我对堆栈溢出问题比较陌生,但我会尽力彻底解释问题。 我目前正在使用 Axis IP Camera 获取 CARMA 板上的实时视频。 GStreamer 然后使用 RTSP 客户端获取这些帧,执行 R
我正在尝试使用 appsink 构建管道,但它占用了大量内存: #!/usr/bin/env python import sys import gi gi.require_version('Gst',
如果我创建一个简单的管道来将 mkv 文件读入 fakesink,它的运行速度将与机器读取和处理文件的速度一样快: $ time gst-launch-1.0 filesrc location=bar
我有一个 gstreamer 管道,它将其所有数据放入一个应用接收器中: command = g_strdup_printf ("autoaudiosrc ! audio/x-raw-int, sig
我正在使用 GStreamer 从 USB 网络摄像头 (Logitech C920) 捕获 H264 视频,并且我想在可能解码或将其流式传输到网络之前分析 h264 帧。 根据互联网上的不同来源,我
我有如下层次结构: 源流水线 GstElement 管道(有一个 videotestsrc 和 appsink) 用于推送样本的 GstAppSrc 指针数组 GstRTSP服务器 GstRTSPMe
我正在使用 GStreamer 构建我的第一个应用程序,我的任务是从互联网获取流,使用 CUDA 对其进行修改(更改像素)以并行计算帧,并输出修改后的流。 为简单起见,目前我使用MP4视频读写磁盘,不
当我在终端上运行时,以下 Gstreamer Receiver 命令工作正常。 gst-launch-1.0 -v udpsrc port=5004 !'application/x-rtp,paylo
我正在尝试使用 AppSink 接收器从中读取样本,但对象上似乎不存在任何 AppSink 方法。 import gi gi.require_version("Gst", "1.0") from gi
我是一名优秀的程序员,十分优秀!