This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux:AM5728 GStreamer 应用程序接收器问题

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/640009/linux-am5728-gstreamer-appsink-issue

工具/软件:Linux

您好:

我想使用 appsink 保存 h264文件。

我们 的 gstreamer 流水线如下所示:

V4l2src ->VPE -> ducatih264enc -> appsink

这是我编写的代码:

#define width 1280
#define height 720

GstFlowReturn sink_new_sample (GstElement*对象、gpointer USER_DATA)

GstSample *样本;
GstBuffer *缓冲区;
GstCaps *caps;
GstStructure *s;
内部宽度、高度;
内部分辨率;

SAMPLE = GST_APP_SINK_PULL_SAMPLE (GST_APP_SINK (对象));
如果(采样= 0)

返回 GST_flow_OK;


CAP = GST_SAMPLE_GET_CAP (sample);
if (!cap){
printf ("无法获取快照格式\n");

S = GST_caps_get_structure (cap、0);
RES = GST_structure_get_int (s、"width"、&width);
RES |= GST_structure_get_int (s、"高度"、&height);
if (!res){
printf ("无法获取快照维度\n");

printf ("width =%d、height =%d\n"、width、height);

Buffer = GST_SAMPLE_GET_buffer (sample);
如果(缓冲区=0)

返回 GST_flow_OK;


GstMapInfo 地图;

IF (GST_buffer_map (buffer、&map、GST_MAP_Read))


printf ("=========== 保存 h264 === \n");
静态文件*fp=0;
fp = fopen ("../test.h264"、"WB");
if (fp!= NULL)


fwrite (map.data、1、map.size、fp);
//fclose (FP);


GST_buffer_unmap (buffer、&map);


GST_SAMPLE_UNREF (SAMPLE);

返回 GST_flow_OK;

int main (int argc、char * argv[])

GstElement *管道,* v4l2src,*过滤器,* VPE,*过滤器1, *ducatih264enc,*queue,*appsink;
GstCaps *caps,*caps1;
静态 GMainLoop *循环;

GST_init (&argc、&argv);

循环= g_main_loop_new (NULL、false);

流水线= GST_F管线_NEW ("流水线");
if (!流水线){
g_printerr ("%d gst_pipel_new error \n"、__line__);
返回-1;

v4l2src = gst_elue_factory_make ("v4l2src"、"v4l2src0");
if (!v4l2src){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);


filter = gst_el元_factory_make ("capsfilter"、"capsfilter0");
如果(!filter){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);

VPE = GST_ELECIN_FACTOR_make ("VPE"、"vpe0");
如果(!VPE){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);

filter1 = gst_element_factory_make ("capsfilter"、"capsfilter1");
如果(!filter1){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);

ducatih264enc = gst_elue_factory_make ("ducatih264enc、"ducatih264enc0");
if (!ducatih264enc){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);


队列= GST_ELECK_factory_make ("队列"、"队列0");
如果(!queue){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);

appsink = gst_elue_factory_make ("appsink"、"appsink0");
如果(!appsink){
g_printerr ("%d gst_element_factory_make 错误\n"、__line__);


GstBus *总线;
总线= GST_PIPRAIN_GET_BUS ((GstPipeline*)管线);
GST_BUS_ADD_WATCH (BUS、(GstBusFunc) BUS_CALLBACK、0);
GST_OBJECT_UNREF (BUS);

G_object_set (G_object (v4l2src)、"device"、"/dev/video1、NULL);
G_object_set (G_object (v4l2src)、"IO-mode"、4、NULL);
cap = gst_caps_new_Simple ("video/x-rain"、
"format"、G_TYPE_string、"YUy2"、
"width"、G_TYPE_INT、width、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);
G_object_set (G_object (filter)、"caps"、caps、NULL);
GST_caps_UNREF (cap);

G_object_set (G_object (VPE)、"num-input-buffers"、8、NULL);
caps1 = gst_caps_new_Simple ("video/x-rain"、
"format"、G_TYPE_string、"NV12"、
"width"、G_TYPE_INT、width、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);
G_object_set (G_object (filter1)、"caps"、caps1、NULL);
GST_CAPS_UNREF (caps1);

//appsink
printf ("====== appsink ==== \n");
GstCaps * sink_caps;

SINK_CAP = GST_caps_new_Simple ("VIDEO/x-RAW"、
"format"、G_TYPE_string、"NV12"、
"宽度"、G_TYPE_INT、宽度、
"高度"、G_TYPE_INT、高度、
"帧速率"、GST_TYPE_FRATE、60、1、
null);

G_object_set (appsink、"发射信号"、true、"caps"、sink_caps、"SYNC"、 false、NULL);

G_signal_connect (appsink、"new-sample"、G_callback (sink_new_sample)、NULL);

gst_bin_add_many (gst_bin (pipeline)、v4l2src、filter、vpe、filter1、 ducatih264enc、队列、appsink、NULL);

gst_element_link_many (v4l2src、filter、VPE、filter1、ducatih264enc、 队列、appsink、NULL);

GST_ELECK_SET_STATE (流水线、GST_STATE_Playing);

G_MAIN_LOOP_RUN (LOOP);
G_MAIN_LOOP_UNREF (LOOP);
返回0;

但我无法收集数据,原因是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我建议您:
    1.在编码器元素后添加 h264parse 元素;
    使用文件链接元素替换 appsink 元素以验证代码是否正常工作。 如果不能使用文件链接元素,请发布您正在观察到的错误。
    3.查看本教程以了解应用程序的用法:
    gstreamer.freedesktop.org/.../short-cutting-the-pipeline.html

    希望这对您有所帮助。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当缓冲区完成后、请确保当您获得回调时、写入文件并 在 EOS 时将其关闭。

    BR
    玛格丽塔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    1、在 ducatih264enc 后添加 h264parse。 管道如下:

    v4l2src ->VPE -> ducatih264enc -> h264parse -> appsink

    在 代码中添加 GST_BUS_ADD_WATCH (BUS、(GstBusFunc) BUS_CALLBACK、0)、以获取 GstMessage 打印信息。

    静态 gboolean bus_callback (GstBus *总线、GstMessage *消息、gpointer * ptr)

    switch (GST_MESSAGE_TYPE (message)){
    案例 GST_MESSAGE_ERROR:{
    gchar *调试;
    GError *err;

    GST_MESSAGE_PART_ERROR (message、&err、&debug);
    g_print ("错误%s\n"、错误->消息);
    G_ERROR_FREE (错误);
    G_FREE (调试);

    中断;
    案例 GST_MESSAGE_WARNING:{
    gchar *调试;
    GError *err;
    const gchar *名称;
    GST_MESSAGE_PART_WARNING (消息、错误、调试);
    g_print ("警告%s\n 调试%s\n"、ERR->消息、调试);
    名称= GST_MESSAGE_SRC_NAME (message);
    g_print (" src %s\n"的名称、名称? 姓名:"无");
    G_ERROR_FREE (错误);
    G_FREE (调试);

    中断;
    案例 GST_MESSAGE_EOS:
    g_print ("流结束\n");
    中断;
    案例 GST_MESSAGE_STATE_CHANGEed:
    中断;
    默认值:
    g_print ("收到消息%s\n"、\
    GST_MESSAGE_TYPED_NAME (GST_MESSAGE_TYPE (MESSAGE));
    中断;

    返回 true;

    Appsink 电容设置如下:

    SINK_CAP = GST_caps_new_Simple ("VIDEO/x-h264"、
        "stream-format"、G_TYPE_string、"byte-stream"、
        "宽度"、G_TYPE_INT、宽度、
        "高度"、G_TYPE_INT、高度、
        null);
      G_object_set (appsink、"发射信号"、true、"caps"、sink_caps、"SYNC"、 false、NULL);
      G_signal_connect (appsink、"new-sample"、G_callback (sink_new_sample)、NULL);

    编译并执行、您可以将 test.h264文件保存在 appsink 信号函数 sink_new_sample"中。 但"ls -lh" check test.h264未找到任何数据

    GstMessage 打印信息:

    获得消息流状态
    获得消息流状态
    获得消息流状态
    获得消息流状态
    获得消息流状态
    获得消息流状态
    收到新时钟消息
    收到消息流启动
    已获取消息 QoS
    已获取邮件标签
    收到消息异步完成
    已获取邮件标签
    已获取邮件标签
    已获取邮件标签

    继续打印"收到的邮件标签"。


    应用程序未设置大写  

     G_object_set (appsink、"emit-Signals"、true、"SYNC"、false、 null);

     G_signal_connect (appsink、"new-sample"、G_callback (sink_new_sample)、NULL);
    测试结果与上述相同。
     
    2、使用文件链接元素替换 appsink 元素可以成功保存 h264文件
    :如下所示
    gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4! 'video/x-raw、format=(string) YUY2、width=(int) 1280、height=(int) 720、framerate=(fraction) 60/1'! VPE num-input-buffers=8! 'video/x-raw、format=(string) NV12、width=(int) 1280、height=(int) 720、framerate=(fraction) 60/1'! ducatih264enc bitrate = 1000! h264parse! filesink location=test.h264
     
    3、我们要使用 appsink 来保存文件、是否有好的建议?

     

     

     

     

     

     

     

     

     

     

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请查看我发布 GST_caps_for_string 函数的教程、了解如何为 appsrc&appsink 设置大写。 我还建议您在本教程中检查 new_sample 函数。

    BR
    玛格丽塔