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;
  }
目录
相关文章
|
机器学习/深度学习 Linux 虚拟化
MagicBook打开虚拟机提示此主机支持 AMD-V,但 AMD-V 处于禁用状态。
MagicBook打开虚拟机提示此主机支持 AMD-V,但 AMD-V 处于禁用状态。
1891 0
MagicBook打开虚拟机提示此主机支持 AMD-V,但 AMD-V 处于禁用状态。
|
6月前
|
存储 人工智能 编解码
Deepseek 3FS解读与源码分析(2):网络通信模块分析
2025年2月28日,DeepSeek 正式开源其颠覆性文件系统Fire-Flyer 3FS(以下简称3FS),重新定义了分布式存储的性能边界。本文基于DeepSeek发表的技术报告与开源代码,深度解析 3FS 网络通信模块的核心设计及其对AI基础设施的革新意义。
Deepseek 3FS解读与源码分析(2):网络通信模块分析
|
8月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
11月前
|
SQL druid Java
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
JDBC和数据库连接池-两个工具类-JDBCUtilsByDruid和BasicDAO
484 0
|
SQL 运维 监控
老系统重构系列--稳定性摸排灵魂三问
该文主要讨论了老系统改造的过程和方法,特别是针对版权资产管理-财资系统的重构。作者强调了系统稳定性的重要性,并分享了他们团队在重构过程中采取的策略。他们通过确定目标、制定方法论和实施步骤来确保问题的全面摸排,包括核心链路图、流程时序图和问题路由图的绘制,以识别可能的问题和需要加强监控的部分。此外,文章还提到了数据对账监控和系统级统一监控的重要性,以及技术改造和预案的制定。作者提供了相关文章链接以供进一步阅读,并分享了他们在摸排和整改过程中的实际成果。
288 0
|
12月前
|
人工智能 Cloud Native 调度
阿里云容器服务在AI智算场景的创新与实践
2024年云栖大会,我们总结过往支持AI智算基础底座的实践经验、发现与思考,给出《容器服务在AI智算场景的创新与实践》的演讲。不仅希望将所做所想与客户和社区分享,也期待引出更多云原生AI领域的交流和共建。
|
机器学习/深度学习 存储 PyTorch
深度学习训练时混合精度的作用
在深度学习训练过程中,混合精度(Mixed Precision)是指同时使用不同的数值精度(如16位浮点数和32位浮点数)来进行计算。
306 2
|
数据采集 机器学习/深度学习 数据挖掘
【办公自动化】用Python在Excel中查找并替换数据
【办公自动化】用Python在Excel中查找并替换数据
323 0
|
存储 编解码
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
《FFmpeg开发实战》书中介绍了音视频编码历史,重点讲述H.264的成功在于其分为视频编码层和网络抽象层。H.264帧类型包括SPS(序列参数集,含视频规格参数),PPS(图像参数集,含编码参数)和IDR帧(立即解码刷新,关键帧)。SPS用于计算视频宽高和帧率,PPS存储编码设置,IDR帧则标志新的解码序列。书中还配以图片展示各帧结构详情,完整内容可参考相关书籍。
633 7
FFmpeg开发笔记(三十)解析H.264码流中的SPS帧和PPS帧
|
Ubuntu 虚拟化 Windows
将虚拟机dmesg日志内容通过串口输出到windows下文件中
将虚拟机dmesg日志内容通过串口输出到windows下文件中
372 0