- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在设计一个管道,将来自 opencv 应用程序(从网络摄像头获取)的视频帧编码为视频/x-h264 格式,通过网络发送并在另一个不同类型的设备(可能是树莓派)上解码) 到适合我的项目的 RGB 流。
为此,我应该使用硬件加速编码器和解码器。由于整个场景很大,目前的开发是在使用 gstreamer VAAPI 插件(vaapiencode_h264 & vaapidecode)的 Intel 机器上进行的。 Á而且,我们不需要使用任何网络插件,如 TCPServer 或 UDPServer
为此,我使用了以下管道:在编码器端:
appsrc name=applicationSource ! videoconvert ! video/x-raw, format=I420, width=640, height=480,framerate=30/1, pixel-aspect-ratio=1/1,interlace-mode=progressive ! vaapiencode_h264 bitrate=600 tune=high-compression ! h264parse config-interval=1 ! appsink name=applicationSink sync=false
Appsrc 部分工作得很好,而 appsink 部分有一些问题。
此管道的 appsink 部分已设置为以下上限:
"video/x-h264, format=(string){avc,avc3,byte-stream },alignment=(string){au,nal};video/mpeg, mpegversion=(int)2,配置文件=(字符串)简单“
我的appsink的数据提取代码是
bool HWEncoder::grabData()
{
// initial checks..
if (!cameraPipeline)
{
GST_ERROR("ERROR AS TO NO PIPE FOUND ... Stopping FRAME GRAB HERE !! ");
return false;
}
if (gst_app_sink_is_eos (GST_APP_SINK(applicationSink)))
{
GST_WARNING("APP SINK GAVE US AN EOS! BAILING OUT ");
return false;
}
if (sample)
{
cout << "sample available ... unrefing it ! "<< endl;
gst_sample_unref(sample);
}
sample = gst_app_sink_pull_sample (GST_APP_SINK(applicationSink));
if (!sample)
{
GST_WARNING("No valid sample");
return false; // no valid sample pulled !
}
sink_buffer = gst_sample_get_buffer(sample);
if (!sink_buffer)
{
GST_ERROR("No Valid Buffer ");return false;
}
return true;
}
启动管道并检查我的 appsink 中是否已填满缓冲区后,我无限期地卡在下面所说的代码行中:
sample = gst_app_sink_pull_sample (GST_APP_SINK(applicationSink));
我有以下问题:1) 我的 appsink 上限是否正确?如果不是,我如何确定它们的上限?2)我上面的管道有问题吗?
如何使用 Appsink 解决这个问题??
任何形式的帮助都是有用的!
谢谢!!
最佳答案
只是一个猜测(我有类似的问题)在同一个管道中有 appsink 和 appsrc 的问题可能是当你填充/清空其中一个时它会阻塞另一个(下面有更多内容)。
appsink 和 appsrc 在满/空时会阻塞 - 这是正常的预期行为。 appsink 或 appsrc 有选项 drop
有选项 block
- 但使用这些可能只是解决方法,你会在你的流中遇到小故障。正确的解决方案是以更好的方式处理 appsrc 和 appsink 之间的同步。
您可以对 appsrc 信号 enough-data
和 need-data
使用react - 这是我们的方式。我们还修改了 appsrc 的属性:is-live
、do-timestamp
和缓冲区大小(这可能对您有帮助,也可能不会帮助您):
g_object_set(src->appsrc,
"stream-type", GST_APP_STREAM_TYPE_STREAM,
"format", GST_FORMAT_TIME,
"do-timestamp", TRUE,
"is-live", TRUE,
"block", TRUE,
NULL);
他们为什么互相屏蔽?因为(我猜)您在主应用程序线程中处理 appsink 并同时处理 appsrc。当 appsink/appsrc 之一阻塞线程时,没有人会处理另一个线程的处理。因此,当 appsink 因为它没有任何数据而被阻止时,没有人可以向 appsrc 提供新数据 - 因此无休止的死锁。
我们还实现了 appsink *pull_sample 方法的 noblock 版本,但这只是一种变通方法,导致的问题多于解决方案。
如果你想调试正在发生的事情,你可以为 appsrc/appsink 添加 GST_DEBUG 条目(我不记得它们是什么),你可以在提到的 enough-data
和 上添加回调需要数据
信号,或者您可以添加队列并启用 GST_DEBUG=queue_dataflow:5 以查看哪个队列首先被填充等。这在调试“数据死锁”时总是很有帮助。
关于c++ - Gstreamer Appsink 没有从管道获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947284/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!