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:编码管道问题

Guru**** 2587365 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/636565/linux-am5728-encode-pipeline-issues

器件型号:AM5728

工具/软件:Linux

您好!

我想使用 AM5728进行捕获和编码。我需要从应用程序中获取资源、 下面是我的代码:

#include
#include
#include
#include
#include

#define frame_264 (1280*720)

int i=0;

typedef 结构体_CustomData{
GstElement *pipeline、*src、*convert、*text、*q1、 *enc、*Q2、*parse、*Q3、*mux、 *c1、*灌电流;

guint64 num_samples;/*迄今生成的样本数(用于时间戳生成)*/

guint sourceId;/*控制 GSource *

GMainLoop * main_loop;// glib 的主循环*
} CustomData;
CustomData 数据;

文件*pfil;
unsigned int *dataPtr =空;

static void new_sample, GstElement *SINK、CustomData *data {

printf ("i2:%d\n"、i);
GstSample *样本;
GstBuffer *缓冲区;
/*检索缓冲区*/
G_signal_emit_by 名称(灌电流、"拉-采样"、示例);
Buffer = GST_SAMPLE_GET_buffer (sample);
int size = gst_buffer_get_size (buffer);

if (buffer){
/*在本示例中,我们唯一要做的就是打印一个*以指示接收到的缓冲区*/
//g_print ("*");
// i++;
GST_buffer_extract (buffer、0、dataPtr、size);
fwrite (dataPtr、sizeof (unsigned int)、size、pfile);
GST_buffer_UNREF (缓冲区);

/*在总线上发布错误消息时调用此函数*/
静态空 ERROR_CB (GstBus *总线、GstMessage * msg、CustomData *数据){
GError *err;
gchar * debug_info;

/*在屏幕上打印错误详细信息*/
GST_MESSAGE_PART_ERROR (msg、&err、&DEBUG_INFO);
g_printerr ("从元素%s 接收到错误:%s\n"、gst_object_name (msg->src)、err->message);
G_printerr ("调试信息:%s\n"、debug_info? debug_info:"none");
g_clear_error (错误);
G_FREE (DEBUG_INFO);

G_MAIN_LOOP_QUIT (DATA->MAIN_LOOP);

静态 gboolean link_source_eleme_wo_filter (GstElement *元件1、
GstElement *元件2)


要链接的/* CAPS:
*'video/x-raw、format=(string) YUY2、width=(int) 800、height=(int) 600、framerate=5/1'
***/

gboolean link_ok;
GstCaps *caps;

cap = gst_caps_new_Simple ("video/x-rain"、
"format"、G_TYPE_string、"YUy2"、
"宽度"、G_TYPE_INT、1280、
"高度"、G_TYPE_INT、720、
"帧速率"、GST_TYPE_FRATE、30、1、
null);

LINK_OK = GST_ELEMENT _LINK_FILTERED (元件1、元件2、电容);
GST_caps_UNREF (cap);

如果(!link_ok){
g_warning ("链接元件1和元件2失败!(v4l2src->convert)");

返回 LINK_OK;

void link_to 多路复用器(
GstElement * tolink_element、
GstElement *多路复用器)

GstCap * pad_caps =空;
GstPad *垫;
GstPad * tolink_pad;
GstPadLinkReturn;

tolink_pad = gst_element_get_static_pad (tolink_element、"src");
PAD_CAP = GST_PAD_QUIEST_CAP (tolink_PAD、NULL);
PAD = GST_ELECING_GET_compatible _pad (mux、tolink_pad、pad_cap);
GST_caps_UNREF (PAD_CAP);

RET = GST_PAD_LINK (tolink_PAD、PAD);
如果(ret=0)
g_print ("aaa\n");
GST_OBJECT_UNREF (GST_OBJECT (PAD));
g_print ("创建了新的焊盘%s 并链接到%s\n"、GST_PAD_GET_NAME (tolink_PAD)、GST_PAD_GET_NAME (焊盘));

Gint 计数器= 10;
gboolean 回调(gpointer arg)

g_print (".");
if (--counter =0){
g_print ("/n");
退出循环 μ s
G_MAIN_LOOP_QUIT (data.main_loop);
注销定时器 μ s
返回 false;

定时器继续运行 μ s
返回 true;

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

pfile=fopen ("file.h264"、"WB+");

memset (&data、0、sizeof (data));

dataPtr=(unsigned int*) malloc (sizeof (unsigned char)* frame_264);
memset (dataPtr、0、frame_264);

GST_init (&argc、&argv);

data.pipeline = gst_pipel_new ("test-pipeline);

data.src = gst_elue_factory_make ("v4l2src"、"video_source");
G_object_set (G_object (data.src)、"device"、"/dev/video2、NULL);
G_object_set (G_object (data.src)、"IO-mode"、4、NULL);
G_object_set (G_object (data.src)、"num-buffers"、2147483647、NULL);

data.text=gst_element_factory_make ("textoverlay"、"text");
G_object_set (G_object (data.text)、"text"、"AFJ"、NULL);

data.convert = gst_elue_factory_make ("vpe"、"converp");
G_object_set (G_object (data.convert)、"num-input-buffers"、8、NULL);
data.q1 = gst_element_factory_make ("队列"、"q1");
data.enc = gst_elue_factory_make ("ducatih264enc、"enc);
//g_object_set (G_object (enc)、"bitrate "、4000、NULL);
data.Q2 = gst_element_factory_make ("队列"、"Q2");
data.parse = gst_elue_factory_make ("h264pars"、"parser");
data.Q3 = gst_element_factory_make ("队列"、"Q3");
data.mux = gst_elue_factory_make ("qtmux"、"mux");
//data.c1 = gst_element_factory_make ("vpe"、"C1");
data.sink = gst_elue_factory_make ("appsink"、"sink");
G_object_set (data.sink、"emit-Signals"、true、NULL);
G_signal_connect (data.sink、"new-sample"、G_callback (new_sample)、&data);

gst_bin_add_many (gst_bin (data.f管线)、data.src、data.convert、data.text、data.q1、 data.enc、data.Q2、data.parse、data.Q3、data.mux、 data.sink、NULL);//data.Q2、data.parse、data.Q3、data.mux、

link_source_element_with _filter (data.src、data.text);
link_source_element_with 过滤器(data.text、data.convert);

if (gst_element_link_pads (data.convert、"src"、data.q1、"sink")!= true)

g_print ("1\n");

if (gst_element_link_pads (data.q1、"src"、data.enc、"sink")!= true)

g_print ("2\n");

if (gst_element_link_pads (data.encc、"src"、data.q2、"sink")!= true)

g_print ("3\n");

if (gst_element_link_pads (data.q2、"src"、data.parse、"sink")!= true)

g_print ("4\n");

if (gst_element_link_pads (data.parse、"src"、data.Q3、"sink")!= true)

g_print ("5\n");

Link_TO_multiplexer (data.Q3、data.mux);
if (gst_element_link_pads (data.mux、"src"、data.sink、"sink")!= true)

g_print ("6\n");


GstBus *总线;
总线= GST_ELECING_GET_BUS (data.f管线);
GST_BUS_ADD_SIGNAL 观察(总线);
G_signal_connect (G_object (总线)、"消息::错误"、(GCallback) ERROR_CB、&data);
GST_OBJECT_UNREF (总线);

GST_ELECK_SET_STATE (data.pipeline、GST_State_Playing);

printf ("i1:%d\n"、i);
G_TIMEOUT_ADD (100、回调、空);

data.main_loop = g_main_loop_new (NULL、false);
G_MAIN_LOOP_RUN (DATA.MAIN_LOOP);

printf ("i3:%d\n"、i);

GST_ELECK_SET_STATE (data.pipeline、GST_State_NULL);
GST_OBJECT_UNREF (数据管道);

返回0;

但是我尝试了这个代码、它显示了这个问题:

那么,你能帮我 还是给我一些建议吗?

赞!

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

    我将进行检查。

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

    在执行应用程序时、是否可以发布完整的调试日志?
    如果用 fakesink 或文件链接替换 appsink 元素,它是否起作用?
    我怀疑您所观察到的错误仅针对 case mux->appsink、而不是针对 case mux->filesink。

    我建议您:
    尝试设置 qtmux 的属性 streamable=true。 我怀疑生成的文件无效。
    您也可以尝试添加对 appsink 的寻道支持。
    您可以查看本教程中的应用程序。 还有一个示例:
    gstreamer.freedesktop.org/.../pipeline-manipulation.html

    希望这对您有所帮助。

    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果我使用文件链接,它会起作用。但我需要使用应用程序接收数据。
    我尝试了您的建议(设置 qtmux 的属性 streamable=true)、但它显示了相同的问题。
    以下是调试日志:
    0:00:00.174394770 1223 0x148a60警告 v4l2bufferpool gstv4l2bufferpool.c:748:gst_v4l2_buffer_pool_start: 缓冲区不够或不足、启用复制阈值
    0:00:00.266806841 1223 0x148a60警告 vpe gstvpepbufferpool.c:466:GST_VPE_buffer_pool_import:分配新的输入缓冲区索引:0/128、0
    0:00:00.278054265 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.281741431 1223 0x148a60警告 vpe gstvpepbufferpool.c:466:GST_VPE_buffer_pool_import:分配新的输入缓冲区索引:1/128、1.
    0:00:00.293842204 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.296479844 1223 0x148a60警告 vpe gstvpepbufferpool.c:466:GST_VPE_buffer_pool_import:分配新的输入缓冲区索引:2/128、0
    0:00:00.304164217 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.314441172 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.324658103 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.334865761 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.345073420 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.355282055 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.358885447 1223 0x148a60警告 v4l2src gstv4l2src.c:862:gst_v4l2src_create: 检测到丢失的帧:计数= 2 - ts:0:00:00.195721486
    0:00:00.361146676 1223 0x148a60警告 vpe gstvpepbufferpool.c:466:GST_VPE_buffer_pool_import:分配新的输入缓冲区索引:3/128、0
    0:00:00.365578041 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.375942510 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.386075993 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.396348230 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败
    0:00:00.404950206 1223 0x148b20警告 qtmux gstqtmux.c:2127:gst_qt_mux_start_file: 错误:下游不可查看-将无法创建可播放文件
    从元素 mux 接收到错误:下游不可查看-将无法创建可播放文件
    调试信息:./../../gst-plugins-good-1.8.3/gst/isomp4/gstqtmux.c (2127):gst_qt_mux_start_file ():/GstPipeline:test-pine/GstQTMux:mux
    0:00:00.406991998 1223 0x145890警告 bufferpool gstbufferpool.c:300:do _alloc_buffer: Alloc 功能失败

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

    请查看我上一帖子中的教程。
    我建议您尝试在您的应用程序中添加寻求支持。
    qtmux 和 appsink 不是 TI 元件、因此我建议在网上搜索类似问题。

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

    您可以检查此代码:
    github.com/.../x264encsample.cpp
    它可能会有所帮助。
    在这里、您还可以找到一些建议:
    gstreamer-devel.narkive.com/.../mp4mux-appsink

    BR
    玛格丽塔