工具/软件: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;
}
但是我尝试了这个代码、它显示了这个问题:
那么,你能帮我 还是给我一些建议吗?
赞!