1. 程式人生 > >gstreamer向appsrc傳送編碼資料的程式碼

gstreamer向appsrc傳送編碼資料的程式碼

  上一篇文章中,提供了傳送視訊幀資料的方法。有人問了,這是理想情況,對於編碼資料,怎麼辦?

  經過一番折騰,終於找到可用的辦法。下面程式碼,測試通過:

#include <gst/gst.h>
 
static FILE * appSrcFile = NULL;
static int  read_counter = 0;
static char read_buffer[4096];

static void cb_need_data (GstElement *source, guint       unused_size, gpointer    user_data)
{
    GstBuffer *buffer;
    GstFlowReturn ret;
    GstMapInfo map;

    g_print("%s\n", __func__);
 
    if (appSrcFile == NULL)
    {
       appSrcFile = fopen("sample_720p.h264", "r");
    }

    size = fread(read_buffer, 1, size, appSrcFile);
    g_print("read_data() read_counter=%d, size=%d\n", read_counter++, size);
 
    if(size == 0)
    {
        ret = gst_app_src_end_of_stream(source);
        g_print("eos returned %d at %d\n", ret, __LINE__);
        return;
    }

    buffer = gst_buffer_new_allocate (NULL, size, NULL);
//這兩個方法都可以
#if 0
    gst_buffer_fill(buffer, 0, read_buffer, size);
#else
    gst_buffer_map (buffer, &map, GST_MAP_WRITE);
    memcpy( (guchar *)map.data, read_buffer, gst_buffer_get_size( buffer ) );
#endif

    g_signal_emit_by_name (source, "push-buffer", buffer, &ret);
    gst_buffer_unref (buffer);
}


gint main (gint   argc, gchar *argv[])
{
  GstElement *pipeline, *appsrc, *conv, *videosink;
 
  /* init GStreamer */
  gst_init (NULL, NULL);
  GMainLoop* loop = g_main_loop_new (NULL, FALSE);
 
  /* setup pipeline */
  pipeline  = gst_pipeline_new ("pipeline");
  appsrc    = gst_element_factory_make ("appsrc",       "source");
  conv      = gst_element_factory_make ("videoconvert", "conv");
  videosink = gst_element_factory_make ("xvimagesink",  "videosink");
 
  gst_bin_add_many (GST_BIN (pipeline), appsrc, conv, videosink, NULL);
  gst_element_link_many (appsrc, conv, videosink, NULL);
 
  /* setup appsrc */
  g_signal_connect (appsrc, "need-data",   G_CALLBACK (cb_need_data), NULL);
  g_object_set(     appsrc, "stream-type", GST_APP_STREAM_TYPE_STREAM, NULL );

  /* play */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);
  g_main_loop_run (loop);
 
  /* clean up */
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (pipeline));
  g_main_loop_unref (loop);
 
  return 0;
  }

相關推薦

gstreamerappsrc傳送編碼資料程式碼

  上一篇文章中,提供了傳送視訊幀資料的方法。有人問了,這是理想情況,對於編碼資料,怎麼辦?   經過一番折騰,終於找到可用的辦法。下面程式碼,測試通過: #include <gst/gst.h> static FILE * appSrcFile = NU

gstreamerappsrc傳送資料程式碼

有一位朋友看了吾《gstreamer向appsrc傳送幀畫面的程式碼》,表示不知道怎麼填充資料。這個吾正好也做了(當時能找到辦法也是運氣好),就開放出來,希望能給朋友們帶來幫助: #define BUFFER_SIZE 4096 static void callback_

gstreamerappsrc傳送幀畫面的程式碼

  這個程式碼可以正常執行,黑白畫面交替: #include <gst/gst.h> #define VIDEO_WIDTH 384 #define VIDEO_HEIGHT 288 #define VIDEO_FORMAT "RGB16" #defi

OkhttpUtils後臺傳送Json資料

OkHttp是一個優秀的網路請求框架。通過對OkHttp的封裝,可以極大的擴充套件其效能。 okhttp-utils是一個對OkHttp的封裝庫,原庫由hongyang封裝,我在其基礎上進行了少許的修改,使其更符合我的專案。 1. 在app專案下的build.gradle

在使用ajax後臺傳送json資料,存在格式不正確的問題

在一次servlet伺服器的專案中,想在前臺使用json向後臺傳送請求,其中data的格式如下: var requestData = { "services": [{ "lightbulb" : [{"alpha":0}], "operat

iOS 後臺傳送json資料

此處有大坑一個,後臺需要json資料,本以為json和字典一樣傳送,結果後臺接收不到,想盡了一切辦法。。。。 直接上程式碼 - (void)didConfirmButtonClickWithItem:(OrderContentModel *)item {     {

iOS 學習日誌 : 伺服器傳送Json資料

前幾天介面需要我向伺服器傳送一個Json資料,但是利用AFNetWorking中的AFHTTPSessionManager傳送到伺服器,介面接收的串一直是URL編碼過後的串,無法和安卓統一,於是換了另一種方法,利用AFHTTPSessionManager的子類A

c++ HTTP POST請求 伺服器傳送json資料

本文只是記錄作者學習c++ http已post請求傳送資料 一 .首先要選擇一個第三方庫,我這裡用的是 libcurl 2. 用VS2013開啟工程curl-7.26.0\lib\libcurl.vcproj,可以直接編譯成功,編譯成libcurl.lib靜態庫 二

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下:

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.soh

Django中使用ajax post後臺傳送資料時403 Forbidden (CSRF token missing or incorrect.):的解決辦法

在Django中使用ajax post向後臺傳送資料時會出現403 Forbidden (CSRF token missing or incorrect.): 的報錯。 第一種解決方法: 先看一下ajax的使用方法: $.ajax({ url: '{% url '

ESP8266MOD、刷可以使用AT指令的韌體、作為客戶端貝殼雲端傳送固定資料

初學ESP8266,先買了一個小的開發板,下面總結一下使用過程中的經驗,以便備用,有不合適的還望指正!謝謝! 硬體部分 1. ESP8266MOD 2. usb資料線一根 3. 圖片如下 硬體準備好之後,直接用資料線連線到電腦即可,然後找到所對應的COM口,記下

Go語言(伺服器開發):客戶端伺服器傳送資料並接收返回資料

客戶端向伺服器傳送資料並接收返回資料。 示例程式碼: package mysocket import ( "fmt" "io" "net" ) func MySocketBase() { var ( host = "www.apache.org" p

flask 後端傳送sockerio請求前端推送資料

# encoding:utf-8 # !/usr/bin/env python ##import psutil import time from threading import Lock import paramiko from flask import Flask, render_temp

通過Thrift sourceFlume傳送資料的Python實現

目前Flume支援Thrift source,即通過一個Thrift服務來收集資料(這一點和scribe是一樣的),然後通過相應的channel傳送到sink中去。以下是具體的實現過程: 環境:Python 2.7.5/CDH4.3 Flume 1.3/Thrift 0.9

Python Django 前後端資料互動 之 後端前端傳送資料 Django 前後臺的資料傳遞

Django 前後臺的資料傳遞 嚴正宣告: 作者: psklf 出處: http://www.cnblogs.com/psklf/archive/2016/05/30/5542612.html 歡迎轉載,但未經作者同意,必須保留此段宣告;必須在文章中給出原文連線;否則必究法律責任!

Android藍芽搜尋裝置,傳送資料並接收

通過藍芽傳輸資料與Socket類似。在網路中使用Socket和ServerSocket控制客戶端和服務端的資料讀寫。而藍芽通訊也由客戶端和服務端Socket來完成。藍芽客戶端Socket是BluetoothSocket,藍芽服務端Socket是BluetoothServerSocket。這兩個類都在包

c++通過Thriftflume傳送資料

在flume原始碼包apache-flume-1.7.0-src\flume-ng-sdk\src\main\thrift\flume.thrift 目錄下,有Flume的Thrift介面定義(IDL)語言,通過該Thrift可以生成客戶端模組基礎程式碼,此處我們生成相應的

kafka原始碼解析之十六生產者流程(客戶端如何topic傳送資料)

客戶端向topic傳送資料分為兩種方式:1.非同步,2同步。其配置為producer.type,如果為sync,則是同步傳送;如果為async,則是非同步傳送。 客戶端程式碼如下: import kafka.javaapi.producer.Producer; import

post請求伺服器傳送資料

package com.xreal.arsearch.utils; import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.

安卓伺服器傳送資料和伺服器接收資料全過程

注意:如果開啟輸出流了 客戶端的請求方法是GET,就會請求到伺服器的POST方法去 安卓端: package com.example.k.servletdemo; import android.app.Activity; import android.os.Bund