- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试为我正在编写的应用程序在 gstreamer-1.0 上覆盖 .png 图像(带有 alpha channel ),但是,在大量搜索网络和阅读文档之后,我仍然对使用方法。
我使用的方法是:
filesrc -> pngdec -> imagefreeze -> videoconvert -> videoscale ->videomixer -> output_of_bininput_of_bin -> videoconvert -> videoscale ->|
这是一个较大应用程序的一小部分。
我的问题是设置 videoscale 和 videoconvert 元素的属性,我认为您应该使用 GSTCaps,但这不起作用。我试过很多方法。这是提供覆盖的类中的成员函数。对于代码的困惑,我深表歉意,但它是实验性的。
bool ImageOverlay::CreateElement()
{
GstPad *source_pad, *sink_pad;
GstElement *file_source, *png_decoder, *freeze, *colorspace,
*video_mixer, *identity, * colorspace2, *video_scale_1, *video_scale_2;
/* Create gstreamer elements */
_image_overlay_element = gst_bin_new("image-player");
if(!_image_overlay_element)
{
g_printerr ("Pipeline could not be created. Exiting.\n");
return false;
}
// Create file source
file_source = gst_element_factory_make ("multifilesrc", "file-source");
g_object_set (G_OBJECT (file_source), "location", "../Template1.png", NULL);
if(!file_source)
{
g_printerr ("File could not be created. Exiting.\n");
return false;
}
// Decode file
png_decoder = gst_element_factory_make ("pngdec", "png-decoder");
if(!png_decoder)
{
g_printerr ("png-decoder could not be created. Exiting.\n");
return false;
}
// Create colour space convertor
colorspace = gst_element_factory_make("videoconvert", "colorspace");
if(!colorspace)
{
g_printerr ("Colorspace could not be created. Exiting.\n");
return false;
}
// Create colour space convertor
colorspace2 = gst_element_factory_make("videoconvert", "colorspace2");
if(!colorspace)
{
g_printerr ("Colorspace could not be created. Exiting.\n");
return false;
}
// Create idenentiy component, does nothing but is useful for debug
identity = gst_element_factory_make("identity", "identity");
if(!identity)
{
g_printerr ("Colorspace could not be created. Exiting.\n");
return false;
}
// Create a video mixer
video_mixer = gst_element_factory_make("videomixer", "mixer");
if(!video_mixer)
{
g_printerr ("videomixer could not be created. Exiting.\n");
return false;
}
// Create a freeze element
freeze = gst_element_factory_make("imagefreeze", "freeze");
if(!freeze)
{
g_printerr ("ImageFreeze could not be created. Exiting.\n");
return false;
}
video_scale_1 = gst_element_factory_make("videoscale", NULL);
if(!video_scale_1)
{
g_printerr ("video_scale_1 could not be created. Exiting.\n");
return false;
}
video_scale_2 = gst_element_factory_make("videoscale", NULL);
if(!video_scale_2)
{
g_printerr ("video_scale_2 could not be created. Exiting.\n");
return false;
}
// Add to the bin
gst_bin_add_many (GST_BIN (_image_overlay_element),
file_source,
png_decoder,
colorspace,
colorspace2,
freeze,
video_mixer,
identity,
video_scale_1,
video_scale_2,
NULL);
if (!gst_element_link_many (file_source, png_decoder, video_scale_1, freeze, NULL))
{
std::cout << "Could not link" << std::endl;
}
GstCaps * caps = gst_caps_new_simple ("video/x-raw",
"format", G_TYPE_STRING, "ARGB",
NULL);
GstCaps * caps2 = gst_caps_new_simple("width", G_TYPE_INT, 640,
"height", G_TYPE_INT, 480,
NULL);
gst_element_link_filtered(video_scale_1, freeze, caps2);
gst_element_link_filtered(video_scale_2, freeze, caps2);
if (!gst_element_link_many(freeze, video_scale_2, colorspace, NULL))
{
std::cout << "Could not link" << std::endl;
}
// Link pads to video mixer
GstPad * sink_pad_1 = gst_element_get_request_pad (video_mixer, "sink_%u");
GstPad * sink_pad_2 = gst_element_get_request_pad (video_mixer, "sink_%u");
GstPad * source_2 = gst_element_get_static_pad (identity, "src");
GstPad * source_1 = gst_element_get_static_pad (colorspace, "src");
gst_pad_set_caps(source_2, caps);
gst_pad_set_caps(source_1, caps);
gst_caps_unref(caps);
if (!gst_pad_link ( source_1, sink_pad_1) == GST_PAD_LINK_OK)
{
std::cout << "Could not link pads" << std::endl;
return false;
}
if (!gst_pad_link ( source_2, sink_pad_2) == GST_PAD_LINK_OK)
{
std::cout << "Could not link pads" << std::endl;
return false;
}
gst_pad_set_active(source_1, true);
gst_pad_set_active(sink_pad_1, true);
gst_pad_set_active(source_2, true);
gst_pad_set_active(sink_pad_2, true);
// Add pad to this element
source_pad = gst_element_get_static_pad (video_mixer, "src");
sink_pad = gst_element_get_static_pad(identity, "sink");
gst_element_add_pad (_image_overlay_element, gst_ghost_pad_new ("src", source_pad));
gst_element_add_pad (_image_overlay_element, gst_ghost_pad_new ("sink", sink_pad));
return true;
}
我想将两个源调整为相同大小,并将 png 图像覆盖在视频上。该 block 主要起作用,但我无法使调整大小或 alpha channel 的东西起作用。
谢谢,
编辑:
我现在已经修改了我的代码并且有了更好的理解,但是,问题似乎在于,如果 capfilter 使用 RGBA,则它不会链接,其他一些格式可以工作但没有用。我不知道为什么。
bool ImageOverlay::MakeElements()
{
try
{
// Creates the bin at this level
CreatePipeline();
GstElement *file_source, *png_decoder, *freeze, *colorspace,
*video_mixer, *identity, * colorspace2, *video_scale_1, *video_scale_2, *caps_filter1, *caps_filter2;
// Create elements
file_source = CreateElementAndAddToBin("multifilesrc", "file-source");
png_decoder = CreateElementAndAddToBin("pngdec", "png-decoder");
colorspace = CreateElementAndAddToBin("videoconvert", "colorspace");
colorspace2 = CreateElementAndAddToBin("videoconvert", "colorspace2");
identity = CreateElementAndAddToBin("identity", "identity");
video_mixer = CreateElementAndAddToBin("videomixer", "mixer");
freeze = CreateElementAndAddToBin("imagefreeze", "freeze");
video_scale_1 = CreateElementAndAddToBin("videoscale", "scale1");
video_scale_2 = CreateElementAndAddToBin("videoscale", "scale2");
caps_filter1 = CreateElementAndAddToBin("capsfilter", "caps_filter1");
caps_filter2 = CreateElementAndAddToBin("capsfilter", "caps_filter2");
// Set input file
g_object_set (G_OBJECT (file_source), "location", "../Template1.png", NULL);
// Create caps
GstCaps *caps = gst_caps_new_simple ("video/x-raw",
"format", G_TYPE_STRING, "YV12", //<<< IF THIS IS SET TO ARGB (THE FORMAT I WANT IT FAILS ON LINKING)
"framerate", GST_TYPE_FRACTION, 25, 1,
"pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
"width", G_TYPE_INT, 640,
"height", G_TYPE_INT, 480,
NULL);
// Set caps on cap filter
g_object_set(G_OBJECT(caps_filter2), "caps", caps, NULL);
g_object_set(G_OBJECT(caps_filter1), "caps", caps, NULL);
// Link up elements
if (!gst_element_link_many (identity, video_scale_2, colorspace2, caps_filter2, video_mixer, NULL))
{
std::cout << "Could not link input branch" << std::endl; //<<<< IF ARGB OR OTHER FORMATS SUCH AS RGBA ARE USED
} // IN CAP FILTER, THIS FAILS, SAME WITH BELOW. IT WORKS WITH YV12!
if (!gst_element_link_many (file_source, png_decoder, freeze, video_scale_1, colorspace, caps_filter1, video_mixer, NULL))
{
std::cout << "Could not link image source branch" << std::endl;
}
// Add ghost pads to this bin, allowing it to be used as an element
SetInputElement(identity);
SetOutputElement(video_mixer);
}
catch(...)
{
std::cout << "Overlay generator failed to build, exception thrown" << std::endl;
// TODO - Clear up in here
return false;
}
return true;
}
最佳答案
从 gstreamer 1.2 开始,视频转换由混音器承担,如果其中一个接收器垫具有 alpha,它将自动选择一种 alpha 格式。
如果您可以更新到 1.2,您需要使用的管道将具有以下形式:
gst-launch-1.0 uridecodebin uri=file:///home/meh/Pictures/pitivi/nicetext.png ! imagefreeze ! videomixer name=m sink_0::zorder=0 ! videoconvert ! autovideosink videotestsrc ! videoscale ! video/x-raw, width=640, height=400 ! m.
其中 nicetext.png 是一个 (png) 640 x 400 图像文件,具有透明背景和一些随机文本。
videoscale 之后的部分是一个 capsfilter,你可以通过以下方式创建它:
gst_element_factory_make("capsfilter", "random_name")
然后将其 caps 属性设置为您需要的宽度和高度。如果事先不知道这一点,您将需要在焊盘上设置一个焊盘探针,您需要从中复制宽度和高度、拦截 caps 事件并在此时将 caps 设置在 capsfilter 上。
如果由于某种原因您不能使用 1.2,那么您将需要在两个分支上使用 videoconvert 和 capsfilter,并指定您需要的格式。
关于c++ - 更改 GStreamer 上的视频格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139162/
我对此很陌生,我在这里的论坛上检查过答案,但我没有找到任何真正可以帮助我的答案。我正在尝试播放 res/raw 文件夹中的视频。到目前为止我已经设置了这段代码: MediaPlayer mp; @Ov
我可以播放一个视频剪辑,检测视频的结尾,然后创建一个表单,然后播放另一个视频剪辑。我的问题是,表单 react 不正确,我创建了带有提交按钮和两个单选按钮可供选择的表单。我希望让用户进行选择,验证响应
首先,我必须说我在web2py讨论组中看到过类似的内容,但我不太理解。 我使用 web2py 设置了一个数据库驱动的网站,其中的条目只是 HTML 文本。其中大多数将包含 img和/或video指向相
我正在尝试在视频 View 中播放 YouTube 视频。 我将 xml 布局如下: 代码是这样的: setContentView(R.layout.webview); VideoV
我正在开发一个需要嵌入其中的 youtube 视频播放器的 android 应用程序。我成功地从 API 获得了 RTSP 视频 URL,但是当我试图在我的 android 视频 View 中加载这个
我目前正在从事一个使用 YouTube API 的网络项目。 我完全不熟悉 API。所以每一行代码都需要付出很多努力。 使用以下代码,我可以成功检索播放列表中的项目: https://www.goog
是否可以仅使用视频 ID 和 key 使用 API V3 删除 youtube 视频?我不断收到有关“必需参数:部分”丢失的错误消息。我用服务器和浏览器 api 键试了一下这是我的代码: // $yo
所以我一直坚持这个大约一个小时左右,我就是无法让它工作。到目前为止,我一直在尝试从字符串中提取整个链接,但现在我觉得只获取视频 ID 可能更容易。 RegEx 需要从以下链接样式中获取 ID/URL,
var app = angular.module('speakout', []).config( function($sceDelegateProvider) {
我正在努力从 RSS 提要中阅读音频、视频新闻。我如何确定该 rss 是用于新闻阅读器还是用于音频或视频? 这是视频源:http://feeds.cbsnews.com/CBSNewsVideo 这是
利用python反转图片/视频 准备:一张图片/一段视频 python库:pillow,moviepy 安装库 ?
我希望在用户双击视频区域时让我的视频全屏显示,而不仅仅是在他们单击控件中的小图标时。有没有办法添加事件或其他东西来控制用户点击视频时发生的情况? 谢谢! 最佳答案 按照 Musa 的建议,附
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我有一个公司培训视频加载到本地服务器上。我正在使用 HTML5 的视频播放来观看这些视频。该服务器无法访问网络,但我已加载 apache 并且端口 8080 对同一网络上的所有机器开放。 这些文件位于
我想混合来自 video.mp4 的视频(时长 1 分钟)和来自 audio.mp3 的音频(10 分钟持续时间)到一个持续时间为 1 分钟的输出文件中。来自 audio.mp3 的音频应该是从 4
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8年前关闭。 Improve this questi
我正在尝试使用 peer/getUserMedia 创建一个视频 session 网络应用程序。 目前,当我将唯一 ID 发送到视频 session 时,我能够听到/看到任何加入我的 session
考虑到一段时间内的观看次数,我正在评估一种针对半自动脚本的不同方法,该脚本将对视频元数据执行操作。 简而言之,只要视频达到指标中的某个阈值,就说观看次数,它将触发某些操作。 现在要执行此操作,我将不得
我正在通过iBooks创建专门为iPad创建动态ePub电子书的网站。 它需要支持youtube视频播放,所以当我知道视频的直接路径时,我正在使用html5 标记。 有没有一种使用html5 标签嵌入
我对Android不熟悉,我想浏览youtube.com并在Webview内从网站显示视频。当前,当我尝试执行此操作时,将出现设备的浏览器,并让我使用设备浏览器浏览该站点。如果Webview不具备这种
我是一名优秀的程序员,十分优秀!