gstreamer基础教程13-Playback speed

Gstreamer基础教程13:Playback Speed 文章目录1.Goal2.介绍3. A Trick mode player3.1 Compile3.2 Code 1.Goal 快进、倒放和慢动作都是所谓的技巧模式,它们都有修改正常播放速率的共同之处。本教程展示了如何实现这些效果,并在处理中添加frame-stepping。特别是,它显示 如何改变播放速率,比正常速度快或慢,向前或向后 如何逐帧推进视频 2.介绍 快进是一种以高于正常(预期)速度播放媒体的技术;而慢动作使用的速度低于预期的速度。反向回放做同样的事情,只是向后,从流的结尾到开始。 所有这些 阅读详情

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84621238

Goal

本章的目的是如何是播放实现一些特技,比如:快进,快退,慢放等。如何一帧一帧的播放视频。

Fast-forward快进, reverse-playback回退 and slow-motion慢放 are all techniques技术 collectively通用的 known as trick特技 modes and they all have in common that modify the normal playback rate. This tutorial shows how to achieve these effects and adds frame-stepping into the deal. In particular, it shows:

  • How to change the playback rate, faster and slower than normal, forward and backwards.
  • How to advance前进播放 a video frame-by-frame

Introduction

快进:以大于常速播放。慢放:以小于常速播放。快退:反方向播放。最后体现一个常速播放速率,=1表示常速,>1表示快速,>0且<1慢速,<0表示反向播放(当然反向也有快慢)。GStream提供两种机制来改变播放速率:Step事件和Seek事件。Step事件可以跳过指定数据(比如逐帧播放)和设置正向速率。Seek事件可以跳转到任意位置,并且可以设置正向和反向速率。

Fast-forward is the technique that plays a media at a speed higher than its normal (intended打算的) speed; whereas slow-motion uses a speed lower than the intended one. Reverse playback does the same thing but backwards, from the end of the stream to the beginning.

All these techniques do is change the playback rate, which is a variable equal to 1.0 for normal playback, greater than 1.0 (in absolute value) for fast modes, lower than 1.0 (in absolute value) for slow modes, positive for forward playback and negative for reverse playback.

GStreamer provides two mechanisms机制 to change the playback rate: Step Events and Seek Events. Step Events allow skipping a given amount of media besides除...之外 changing the subsequent playback rate (only to positive values). Seek Events, additionally额外的, allow jumping to any position in the stream and set positive and negative playback rates.

第四节已经使用了seek事件,这一章详细解释如何使用这些事件。因为Step事件需要的参数更少,所以使用更加方便,但是Step有一些缺点,所以这里我们使用seek事件。Step事件只能作用于sink,而Seekp事件作用于整个pipeline。Step的优点是比较快,但是无法改变速率反向(不能快退)。

In Basic tutorial 4: Time management seek events have already been shown, using a helper function to hide their complexity. This tutorial explains a bit more how to use these events.

Step Events are a more convenient更方便 way of changing the playback rate, due to the reduced number of parameters needed to create them; however, they have some downsides缺点, so Seek Events are used in this tutorial instead代替. Step events only affect the sink (at the end of the pipeline), so they will only work if the rest of剩下 the pipeline can support going at a different speed, Seek events go all the way through the pipeline so every element can react to them. The upside of Step events is that they are much faster to act. Step events are also unable to change the playback direction.

为了使用这些事件,我们创建之后传递给pipline,pipline向上传递知道找到可以处理他们的element。如果这个事件传递给先playbin这样的复合element中,playbin只是简单的把事件通知所有的sink去执行。一般经常使用的方法是检索video或audio其中的一个sink,然后把是事件直接作用到指定的sink。逐帧播放就是让视频一帧一帧的播放,逐帧播放是通过暂停pipeline,然后发送step事件每次跳过一帧。

To use these events, they are created and then passed onto the pipeline, where they propagate传播 upstream until they reach an element that can handle them. If an event is passed onto a bin element like playbin, it will simply feed the event to把事件供应给 all its sinks, which will result in multiple seeks being performed执行. The common approach方法 is to retrieve检索 one of playbin’s sinks through the video-sink or audio-sink properties and feed the event directly into the sink.

Frame stepping is a technique that allows playing a video frame by frame. It is implemented by pausing the pipeline, and then sending Step Events to skip one frame each time.

A trick mode player

Copy this code into a text file named basic-tutorial-13.c.

basic-tutorial-13.c

#include <string.h>
#include <stdio.h>
#include <gst/gst.h>

typedef struct _CustomData {
  GstElement *pipeline;
  GstElement *video_sink;
  GMainLoop *loop;

  gboolean playing;  /* Playing or Paused */
  gdouble rate;      /* Current playback rate (can be negative) */
} CustomData;

/* Send seek event to change rate */
static void send_seek_event (CustomData *data) {
  gint64 position;
  GstFormat format = GST_FORMAT_TIME;
  GstEvent *seek_event;

  /* Obtain the current position, needed for the seek event */
  if (!gst_element_query_position (data->pipeline, &format, &position)) {
    g_printerr ("Unable to retrieve current position.\n");
    return;
  }

  /* Create the seek event */
  if (data->rate > 0) {
    seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
        GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_NONE, 0);
  } else {
    seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
        GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, position);
  }

  if (data->video_sink == NULL) {
    /* If we have not done so, obtain the sink through which we will send the seek events */
    g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
  }

  /* Send the event */
  gst_element_send_event (data->video_sink, seek_event);

  g_print ("Current rate: %g\n", data->rate);
}

/* Process keyboard input */
static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
  gchar *str = NULL;

  if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) {
    return TRUE;
  }

  switch (g_ascii_tolower (str[0])) {
  case 'p':
    data->playing = !data->playing;
    gst_element_set_state (data->pipeline, data->playing ? GST_STATE_PLAYING : GST_STATE_PAUSED);
    g_print ("Setting state to %s\n", data->playing ? "PLAYING" : "PAUSE");
    break;
  case 's':
    if (g_ascii_isupper (str[0])) {
      data->rate *= 2.0;
    } else {
      data->rate /= 2.0;
    }
    send_seek_event (data);
    break;
  case 'd':
    data->rate *= -1.0;
    send_seek_event (data);
    break;
  case 'n':
    if (data->video_sink == NULL) {
      /* If we have not done so, obtain the sink through which we will send the step events */
      g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
    }

    gst_element_send_event (data->video_sink,
        gst_event_new_step (GST_FORMAT_BUFFERS, 1, ABS (data->rate), TRUE, FALSE));
    g_print ("Stepping one frame\n");
    break;
  case 'q':
    g_main_loop_quit (data->loop);
    break;
  default:
    break;
  }

  g_free (str);

  return TRUE;
}

int main(int argc, char *argv[]) {
  CustomData data;
  GstStateChangeReturn ret;
  GIOChannel *io_stdin;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Initialize our data structure */
  memset (&data, 0, sizeof (data));

  /* Print usage map */
  g_print (
    "USAGE: Choose one of the following options, then press enter:\n"
    " 'P' to toggle between PAUSE and PLAY\n"
    " 'S' to increase playback speed, 's' to decrease playback speed\n"
    " 'D' to toggle playback direction\n"
    " 'N' to move to next frame (in the current direction, better in PAUSE)\n"
    " 'Q' to quit\n");

  /* Build the pipeline */
  data.pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);

  /* Add a keyboard watch so we get notified of keystrokes */
#ifdef G_OS_WIN32
  io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
#else
  io_stdin = g_io_channel_unix_new (fileno (stdin));
#endif
  g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);

  /* Start playing */
  ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
  if (ret == GST_STATE_CHANGE_FAILURE) {
    g_printerr ("Unable to set the pipeline to the playing state.\n");
    gst_object_unref (data.pipeline);
    return -1;
  }
  data.playing = TRUE;
  data.rate = 1.0;

  /* Create a GLib Main Loop and set it to run */
  data.loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (data.loop);

  /* Free resources */
  g_main_loop_unref (data.loop);
  g_io_channel_unref (io_stdin);
  gst_element_set_state (data.pipeline, GST_STATE_NULL);
  if (data.video_sink != NULL)
    gst_object_unref (data.video_sink);
  gst_object_unref (data.pipeline);
  return 0;
}

这个例子播放一个互联网上的音视频文件(受网络影响可能会有卡顿)。控制台会显示可用的命令,通过输入大写或小写字母+回车,开控制视频播放。

This tutorial opens a window and displays a movie, with accompanying audio. The media is fetched from the Internet, so the window might take a few seconds to appear, depending on your connection speed. The console shows the available commands, composed of a single upper-case or lower-case letter字母, which you should input followed by the Enter key.

Walkthrough

这里没有其他新的东西,唯一增加的就是键盘的监控,输入键盘内容,跳转到键盘监控函数,如下:p来控制暂停/开始(切换还是有gst_element_set_state()控制),S速率*2,s速率/2,d控制方向的变化,n控制一帧一帧播放。

There is nothing new in the initialization code in the main function: a playbin pipeline is instantiated, an I/O watch is installed to track keystrokes敲击键盘 and a GLib main loop is executed.

Then, in the keyboard handler function:

/* Process keyboard input */
static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
  gchar *str = NULL;

  if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) {
    return TRUE;
  }

  switch (g_ascii_tolower (str[0])) {
  case 'p':
    data->playing = !data->playing;
    gst_element_set_state (data->pipeline, data->playing ? GST_STATE_PLAYING : GST_STATE_PAUSED);
    g_print ("Setting state to %s\n", data->playing ? "PLAYING" : "PAUSE");
    break;

Pause / Playing toggle切换 is handled with gst_element_set_state() as in previous tutorials.

case 's':
  if (g_ascii_isupper (str[0])) {
    data->rate *= 2.0;
  } else {
    data->rate /= 2.0;
  }
  send_seek_event (data);
  break;
case 'd':
  data->rate *= -1.0;
  send_seek_event (data);
  break;

Use ‘S’ and ‘s’ to double or halve the current playback rate, and ‘d’ to reverse the current playback direction. In both cases, the rate variable is updated and send_seek_event is called. Let’s review this function.

/* Send seek event to change rate */
static void send_seek_event (CustomData *data) {
  gint64 position;
  GstEvent *seek_event;

  /* Obtain the current position, needed for the seek event */
  if (!gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position)) {
    g_printerr ("Unable to retrieve current position.\n");
    return;
  }

这个函数就是发送一个Seek事件,来控制速率变化。position是一个返回值,返回当前的位置。这里不使用step事件的原因前边已经说明。(注:原文档内容与实际Demo中的内容不一致,以Demo内容为主)。seek事件通过通过函数gst_event_new_seek来创建,主要参数包括:速率,开始位置,结束位置。开始位置必须小于结束位置。(-1表示文件末尾).正如前边解释,为了防止多次Seek,这个Seek事件仅仅发送给一个sink。这里发送给video-sink.

This function creates a new Seek Event and sends it to the pipeline to update the rate. First, the current position is recovered with gst_element_query_position(). This is needed because the Seek Event jumps to another position in the stream, and, since we do not actually want to move, we jump to the current position. Using a Step Event would be simpler, but this event is not currently fully functional, as explained解释 in the Introduction.

  /* Create the seek event */
  if (data->rate > 0) {
    seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
        GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_SET, -1);
  } else {
    seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
        GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, position);
  }

The Seek Event is created with gst_event_new_seek(). Its parameters are, basically主要, the new rate新的速率, the new start position新的开始位置 and the new stop position新的停止位置. Regardless of the playback direction, the start position must be smaller小于 than the stop position, so the two playback directions are treated differently.

if (data->video_sink == NULL) {
  /* If we have not done so, obtain the sink through which we will send the seek events */
  g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
}

As explained in the Introduction, to avoid performing multiple Seeks, the Event is sent to only one sink, in this case, the video sink. It is obtained from playbin through the video-sink property. It is read at this time instead at initialization time because the actual sink may change depending on the media contents, and this won’t be known until the pipeline is PLAYING and some media has been read.

/* Send the event */
gst_element_send_event (data->video_sink, seek_event);

The new Event is finally sent to the selected sink with gst_element_send_event().

通过n可以控制逐帧播放,通过step事件来控制逐帧播放。通过gst_event_new_step创建step,主要参数有帧数、速率等。

Back to the keyboard handler, we still miss the frame stepping code, which is really simple:

case 'n':
  if (data->video_sink == NULL) {
    /* If we have not done so, obtain the sink through which we will send the step events */
    g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
  }

  gst_element_send_event (data->video_sink,
      gst_event_new_step (GST_FORMAT_BUFFERS, 1, ABS (data->rate), TRUE, FALSE));
  g_print ("Stepping one frame\n");
  break;

A new Step Event is created with gst_event_new_step(), whose parameters basically specify the amount数量 to skip (1 frame in the example) and the new rate (which we do not change).

The video sink is grabbed获取 from playbin in case we didn’t have it yet, just like before.

And with this we are done. When testing this tutorial, keep in mind that backward playback is not optimal最佳的 in many elements.

改变速率可能仅仅对本地文件有效,如果上述URL无效,可以尝试把URL改为本地文件,以file:///开头。(这里我没有尝试成功,我把Demo中的文件sintel_trailer-480p.webm下载到本地,然后URL修改为本地地址,直接播放失败)

Changing the playback rate might only work with local files. If you cannot modify it, try changing the URI passed to playbin in line 114 to a local URI, starting with file:///

Conclusion

This tutorial has shown:

  • How to change the playback rate using a Seek Event, created with gst_event_new_seek() and fed to the pipeline with gst_element_send_event().
  • How to advance a video frame-by-frame by using Step Events, created with gst_event_new_step().

It has been a pleasure having you here, and see you soon!

GStreamer插件:appsrc 解决播放实时视频流高延迟问题 appsrc = (GstAppSrc*) gst_element_factory_make ("appsrc", NULL); g_object_set (appsrc, "is-live", TRUE, NULL); g_object_set (appsrc, "stream-type", 0, NULL); g_object_set (appsrc, "format", GST_FORMAT_TIME, NULL); // 给实时视频流打上时间戳 g_object_set. 阅读详情

相关推荐

GStreamer基础教程13:播放速度

目标 快进,倒放和慢放是trick模式的共同技巧,它们有一个共同点就是它们都修改了播放的速度。本教程会展示如何来获得这些效果和如何进行逐帧的跳跃。主要内容是: 如何来变换播放的速度,变快或者变慢,前进或者后退 如何一帧一帧的播放视频 介绍 快进是以超过正常速度播放媒体的一项技术,反之,慢放是以低于正常速度播放的技术。倒放和播放是一样的,只不过是从后面朝前面播放。 所有这些技术做的都是修改...

ZONGXP的博客 1279

GStreamer Basic tutorial 学习笔记(十三)

【墨染】GStreamer Basic tutorial学习笔记的第十三篇,参考GStreamer官方文档和示例代码,整理了相关知识点。

墨染 477

脑机接口(BCI)从原理到开发实战 07|运动想象BCI实战:基于BCI Competition IV 2a数据集

本文基于BCI Competition IV 2a数据集,详细介绍运动想象脑机接口系统的全流程实现。首先概述了该数据集的实验范式、参数特点和优势,然后指导环境准备与数据下载。通过代码示例展示了数据加载、事件标记提取和信号可视化方法。重点构建了完整的预处理流水线,包括通道选择、重参考、带通滤波(8-30Hz)和ICA去伪迹等关键步骤。文章旨在帮助读者将零散的BCI知识整合为完整的实战项目,掌握从原始脑电数据到运动意图解码的核心技术。

小明的博客 849

gstreamer视频播放卡死或者发生crash

在一个项目开发时,采用gstreamer架构播放.MP4视频时,有时进程莫名其妙的卡死或者发生crash。 最终查到的原因是gstreamer播放视频的过程中更改系统时钟从而引起的BUG。 由于gstreamer播放视频时,各个插件插件采用的是以系统时钟的时间戳同步机制。如果系统时钟变更,各个插件的时间同步机制就有可能被破坏,从而引起进程卡死或者crash. ...

1732

gm/Id 设计方法

本文介绍gm/Id方法的具体实现。

maxwell2ic的博客 4万+

Workbench-nCode下发动机引擎应力疲劳分析

在工程数据库中定义材料模型参数,结构场分析基本参数:密度7850Kg/m3、弹性模量210E9Pa、泊松比0.3,疲劳分析参数:应力-疲劳曲线表(S-N Curve),应力-疲劳曲线如下图2所示,如果没有合适的数据可使用结构钢材料进行分析。网格为四面体高阶单元,各零件的单元尺寸如下表1所示,单元质量分布如下图3所示。在workbench平台下搭建分析流程如下图6所示,前述设定完成后,提交求解后即可得到相应的应力、应变结果,更新结果后目录树中会有相应的nCode DesignLife插件,如下图7所示。

ansysxuexizhe的博客 1547

GStreamer基础教程13——播放速度

本教程会展示如何来获得快进,倒放和慢放的效果以及如何进行逐帧的跳跃。

sakulafly的专栏 1万+

Isograph Reliability Workbench 14实战:从零构建故障树分析模型

本文以“马达不转”为例,手把手教你使用Isograph Reliability Workbench 14从零构建故障树分析模型。内容涵盖创建工程、定义顶事件、添加逻辑门与基础事件等核心步骤,并介绍了模型检查与定性定量分析,帮助你系统掌握这一强大的可靠性工程工具。

weixin_29309213的博客 359

GStreamer——教程——基础教程13:Playback speed

快进是一种以高于媒体正常(预期)速度播放的技巧;而慢动作则使用低于预期的速度。反向播放也是同样的方式,但从流的末尾开始到开头。所有这些技术所做的就是改变播放速率,这是一个等于1.0的变量用于正常播放,大于1.0(绝对值)的速度用于快速模式,小于1.0(绝对值)的速度用于慢速模式,正数表示正向播放,负数表示反向播放。GStreamer提供了两种改变播放速率的机制:Step事件和Seek事件。Step事件允许跳过给定数量的媒体,同时改变后续的播放速率(仅设置为正值)。

FREEDOM_X的专栏 1581

IMEI引起的无法驻网问题

问题不复杂,场景很简单,如上图,UE在进行LTE attach过程时,在送完NAS security mode complete后,就立刻收到了网络attach reject 带cause 6 Illegal ME,根据协议描述这个cause 代表ME不被网络可接受,例如ME在禁止名单或者黑名单中就会有这种cause。然而前方在报这个问题的时候,也是知道SIM卡和手机IMEI在运营商那边没能成功绑定,然后才报的问题,要查看手机是不是有问题...... 告诉前方原因后,还认为是手机问题,告知要继续查。

asd199086的博客 1426

【Python高阶开发】12. 工业知识图谱实战:从0构建设备故障诊断系统(附Neo4j部署+完整代码)

摘要:传统工业设备故障诊断依赖专家经验,存在知识难沉淀、故障定位慢、根因分析不彻底等痛点。本文基于开源工具栈(Neo4j+Py2neo+Spacy+FastAPI),从0到1构建工业知识图谱故障诊断系统。内容涵盖:知识图谱核心概念解析、Neo4j图数据库部署、工业设备本体设计、多源知识抽取(结构化Excel+非结构化手册)、图谱构建与查询、故障诊断与根因分析功能实现,以及可视化与API服务部署。每个模块附完整可运行代码及执行结果,新手可按步骤复现全流程,进阶读者可直接复用代码到实际项目

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1107

GStreamer Tutorial 中文翻译:Basic tutorial 13: Playback speed

GStreamer Tutorial 13中文翻译 文章目录GStreamer Tutorial 13中文翻译前言[Basic tutorial 13: Playback speed](https://gstreamer.freedesktop.org/documentation/tutorials/basic/playback-speed.html?gi-language=c)目的简介技巧模式播放器示例代码走读结论 前言 由于工作原因,用的GStreamer的图像解码库,所以记录GStreamer T

wuchangwen0216的博客 415

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1309

gstreamer系列 -- 播放速率控制

gstreamer系列 -- 播放速率控制

智能机器人产学研基地 386

第七天 Labview进阶(7.3 Teststand简单使用)

TestStand是NI开发的自动化测试管理软件,支持多语言编程和硬件集成,广泛应用于电子产品和工业测试。安装时需注意版本选择,2022版支持离线安装。使用步骤包括:1)创建测试序列文件;2)插入测试动作并配置参数(如选择VI路径、设置变量);3)添加条件判断和延时控制;4)执行测试序列时具备流程控制功能,如失败步骤自动跳过后续测试。该软件能有效提升测试效率与准确性,通过可视化操作实现复杂测试流程管理。

weixin_38637405的博客 1728

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【Gstreamer 13】基础教程之 播放速度

Gstreamer 基础教程之 播放速度

Jayson 博客 1508

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

gstreamer play speed fastforward fastbackward

转自:http://docs.gstreamer.com/display/GstSDK/Basic+tutorial+13%3A+Playback+speed   Goal Fast-forward, reverse-playback and slow-motion are all techniques collectively known as trick modes and they

haima1998的专栏 1289

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

US.KG 免费二级域名怎么注册?几分钟跑完全流程

DigitalPlat FreeDomain 可以免费注册 .us.kg、.dpdns.org、.qzz.io、.xx.kg、.qd.je 这类二级域名,注册后再通过外部 DNS 服务把域名指向你的网站或邮箱。本文按真实操作顺序走一遍:建账户、查名字、填名称服务器、配解析记录、验证生效,最后讲日常维护,适合没有域名经验、想搭个人站点或项目站点的人。 ## 先看清规则:额度、限制与以公告为准的部分

gitblog_00590的博客 201

前端学习(2489):初识vue以及引入vue

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta ht...

歌谣的博客 925

使用jQuery播放/暂停 HTML5视频

我尝试用jQuery控制HTML5视频,两个视频分别在两个tab中,我希望点中tab后,该tab里的视频可以立即播放,而另外tab里的视频能够停止。 我的代码是这样的:     $('#playMovie1').click(function(){     $('#movie1').play();     }); 但发现这样不行,而用以下的js是可以的: docu

走在前端路上的小白 1万+

MPEG TS流简介

TS简介 MPEG-TS(Transport stream)即Mpeg传输流定义于ITU-T Rec. H.222.0和ISO 13818-1标准中,属于MPEG2的系统层。MPEG2-TS面向的传输介质是网络和卫星等可靠性较低的传输介质,这一点与面向较可靠介质如DVD等的MPEG PS不同。 1. TS数据包 TS流由TS数据包即Transport stream packet组成。TS p...

zhaoyaofeng的专栏 4327

FFMPEG之海康实时回调出来的PS流格式

FFMPEG之海康实时回调出来的PS流格式 前言: 我们知道,利用海康的实时预览接口可以实时监控,并且可以设置回调函数取出码流数据。而根据海康的参考文档中,回调函数的数据类型有三种,一个是系统头;一个是码流数据;另一个是其它数据,这三个值分别对应宏值为0,1,2。但是我们需要注意,当值=1时,该码流数据并不是h264类型(好像有部分设备是支持直接输出H264,我不太记得了),而是被封装成PS流格式的类型。所以我们在推流或者保存的过程中,需要将PS流转成H264码流。 海康针对H264 做如下PS 封装: 每

weixin_44517656的博客 1万+

PES,TS,PS,RTP等流的打包格式解析之PES流

因为工作接触到了各种不同的音视频封装格式,常见的国标PS流,onvif的RTP流和TS流等,都说好记性不如烂笔头,抽空总结下,也好在以后能随时查阅,因水平问题,可能会有地方有疏漏和问题,还请指教 一、PES流 PES流是对原始ES流进行的第一层封装,PES流的基本单位是PES包,由包头和payload组成,ES流即音视频裸流,是从编码器里面出来的原始视频音频流;ES流只包含一种内容,里面是视频

appledurian的博客 1万+

组播流媒体卡顿问题排查

问题-播放组播流卡顿 操作系统:Linux 硬件平台:Arm64 播放工具:Gstreamer-1.0 步骤: 在一台PC上通过ffmpeg命令行推送ts组播流,通过rtp协议传输ts流。 ffmpeg -re -stream_loop -1 -i hd1080.mp4 -c:v copy -c:a copy -f rtp_mpegts rtp://239.239.22.22:3333 在arm开发板上通过Gstreamer命令行工具播放该组播流。 目前gstreamer 无法通过playbin

zk5950886的博客 4904
上一篇: gstreamer基础教程12-Streaming
下一篇: gstreamer基础教程14-Handy elements
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值