目标是实现一个实时转码,可用于IPTV提供节目源。

相关工作在ubuntu操作系统下进行。需要对源代码进行修改的时候,直接采用apt-get source命令获取源代码,根据需要进行修改,然后安装,这样能最大限度的保证兼容性和稳定性。

命令行示例

gstreamer是通过不同功能的element构成pipeline的方式来工作的,一个transcoding也是通过解码,编码等各种element构成的pipeline来实现的。采用gstreamer的命令行工具就能实现各种复杂的转码功能,不过一个复杂的应用还是要通过编程来实现。下面是一个例子:

gst-launch-0.10 filesrc location=mpts.ts !

mpegtsdemux !

ffdec_mpeg2video !

ffenc_mpeg2video bitrate=3500000 !

ffmux_mpegts !

filesink location=m

输入

  • filesrc:文件。
  • udpsrc:IP网络,可以采用IP输出的工程用数字电视接收机。
  • v4lsrc:采集卡,测试过Osprey,微视图像的采集卡
  • v4lsrc:DVB数字电视卡,测试过卫星电视卡。
  • v4lsrc:中国标准的DMB-TH地面数字电视接收卡,做过测试。
  • v4lsrc:中国标准的ABS-S,中星九号卫星电视接收卡,没有找到过合适的硬件。

输出

  • filesink:文件
  • udpsink:IP网络组播或者单播
  • RTSPv

解复用

解复用选择ffdemux_mpeg2ts,需要考虑到时间戳的问题,见《ffdemux_mpegts中时间戳的处理问题

解码

  • ffdec_mpeg2video:ffmpeg的gstreamer插件,可以解码多种格式,包括mpeg2,mpeg4,264,vp6等。
  • mpeg2dec:用于mpeg2解码。

对于解码相对比较容易,要求不是很苛刻。

编码

  • x264enc:x264编码,效率相当高,在4核的CPU上可以实现4路标清编码。支持多线程编码。
  • ffenc_mpeg2video:ffmpeg的mpeg2编码,效率比较高,在32位的ubuntu server 10.04.1上经过验证效率较高,一个cpu核心接近两个标清实时编码,在64位的ubuntu server 10.10上则效率比较低。不支持多线程?
  • mpeg2enc:支持多线程,但是效率明显不如ffenc_mpeg2video。需要明确gop的大小,并明确需要在每个gop之前加入序列头,否则这些都没有,图像质量不如ffmpeg的mpeg2video编码,不支持interlaced。

因此对于264选择x264enc,对于mpeg2应该选择ffmpeg,但是需要增加对于多线程的支持,否则实时编码的效果不理想,会经常出现马赛克。

封装

  • ffmux_mpegts:mpegts封装,不支持CBR封装(在《视频编码中的码率控制及应用》有如何添加CBR支持的描述)。PCR的计算比较精确,对于CBR是40ms,对于VBR是80ms。
  • mpegtsmux:同样是mpegts封装,同样不支持CBR封装。PCR的计算比较粗,抖动非常厉害。

如下命令对于码率控制比较理想,具体原因后续研究:

gst-launch-0.10 filesrc location=movies/sd/fengkuangdeshitou.mpg ! queue ! ffdemux_mpegts name=demuxer
! queue ! ffdec_mpeg2video ! queue ! ffenc_mpeg2video bitrate=3100000 rc-min-rate=3100000 rc-max-rate=3100000 rc-buffer-size=3100000 flags=0x80000000 ! queue ! ffmux_mpegts name=muxer preload=10000 maxdelay=500000 ! queue ! filesink location=rainbow-fengkuangdeshitou.ts
demuxer. ! queue ! ffdec_mp3 ! queue ! ffenc_mp2 ! muxer.

注意其中的“preload=10000 maxdelay=500000”参数,需要进行设置,其单位是微妙。如果没有设置或者设置的过小,会声音比较卡,同时vlc提示信息是:

main warning: PTS
is out of range (-12338), dropping buffer

main warning: PTS
is out of range (-36285), dropping buffer

main warning: buffer
is 48273 in advance, triggering downsampling

main warning: output
date isn't PTS date, requesting resampling (41472)

main warning: PTS
is out of range (-14790), dropping buffer

main warning: output
PTS is out of range (19076), clearing out

main warning: input
PTS is out of range (40218), trashing

main warning: input
PTS is out of range (16240), trashing

main warning: PTS
is out of range (-38685), dropping buffer

main warning: buffer
is 54946 in advance, triggering downsampling

main warning: output
date isn't PTS date, requesting resampling (81818)

main warning: resampling
stopped after 128303 usec (drift: -26913)

main warning: computed
PTS is out of range (10357), clearing out

main warning: PTS
is out of range (37465), dropping buffer

main warning: output
PTS is out of range (16621), clearing out

因为ffenc_mpeg2video的效率没有之前想象的那么高,至少在xeon5506上一个CPU核不能达到实时编码,又不支持多个线程编码,因此采用mpeg2enc编码:

gst-launch-0.10 udpsrc multicast-group=239.1.80.80 port=49500 ! queue ! ffdemux_mpegts name=demuxer ! queue ! ffdec_mp3 ! queue ! ffenc_mp2 ! queue ! ffmux_mpegts
name=muxer preload=10000 maxdelay=500000 muxrate=3600000 ! udpsink host=239.100.100.100 port=12345 demuxer. ! queue ! queue ! ffdec_mpeg2video ! queue ! mpeg2enc format=3 bitrate=2900 closed-gop=true sequence-header-every-gop=true ! muxer.

换了一个视频解码,用mpeg2dec

gst-launch-0.10 udpsrc multicast-group=239.1.80.80 port=49500 ! queue ! ffdemux_mpegts name=demuxer ! queue ! ffdec_mp3 ! queue ! ffenc_mp2 ! queue ! ffmux_mpegts name=muxer preload=10000 maxdelay=500000 muxrate=3600000
! udpsink host=239.100.100.100 port=12345 demuxer. ! queue ! mpeg2dec ! queue ! mpeg2enc format=3 bitrate=2900 closed-gop=true sequence-header-every-gop=true ! muxer. --gst-debug-level=2 > udp188-log.txt 2>&1 &

ffmpeg的mpeg2视频编码的gstreamer插件不支持多线程!!!!

参考资料

  1. Real-time MPEG-2 encoding with ffmpeg

【miscellaneous】基于gstreamer的实时转码的更多相关文章

  1. 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)

    目录 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) 翻译软件上传到github上. 软件截图 主要的思想 界面方面 程序方面 制作属于自己的翻译软件(基于PyQt5+Python+ ...

  2. 基于Kafka的实时计算引擎如何选择?(转载)

    1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...

  3. 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍

    第3章. 基础概念介绍 本章将介绍GStreamer的基本概念. 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念. 3.1. 元件(Elements) 元件 ...

  4. 前端Web浏览器基于Flash如何实时播放监控视频画面(四)之使用videoJs‘拉流’

    本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 下载videoJs 对于Video.js 5.x及更低版本,Flash技术(v ...

  5. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视频 ...

  6. 基于Xenomai的实时Linux分析与研究

    转自:http://blog.csdn.net/cyberlabs/article/details/6967192 引 言 随着嵌入式设备的快速发展,嵌入式设备的功能和灵活性要求越来越高,很多嵌入式设 ...

  7. 项目-基于视频压缩的实时监控系统--tiny6410

    项目-基于视频压缩的实时监控系统--tiny6410 @国嵌linux学习笔记. 1. 构造服务端结构体 server struct server { int epfd; //保存epoll指针 st ...

  8. 基于Eclipse搭建Hadoop源码环境

    Hadoop使用ant+ivy组织工程,无法直接导入Eclipse中.本文将介绍如何基于Eclipse搭建Hadoop源码环境. 准备工作 本文使用的操作系统为CentOS.需要的软件版本:hadoo ...

  9. 基于GPUImage的实时美颜滤镜

    1.背景 前段时间由于项目需求,做了一个基于GPUImage的实时美颜滤镜.现在各种各样的直播.视频App层出不穷,美颜滤镜的需求也越来越多.为了回馈开源,现在我把它放到了GitHub https:/ ...

随机推荐

  1. 使用AJAX传输不了值时

    当时候AJAX往后台传递值时  传不到后台  这时我们就要检查程序是否有问题了 一般AJAX程序 $.ajax( { type: "POST", url: "Login. ...

  2. RSA公钥私钥原理及作用

    RSA算法广泛应用与加密与认证两个领域 1.加密(保证数据安全性) 使用公钥加密,需使用私钥解密. 这种广泛应用在保证数据的安全性的方面,用户将自己的公钥广播出去,所有人给该用户发数据时使用该公钥加密 ...

  3. luogu 3200 [HNOI2009]有趣的数列 卡特兰数+质因数分解

    打个表发现我们要求的就是卡特兰数的第 n 项,即 $\frac{C_{2n}^{n}}{n+1}$. 对组合数的阶乘展开,然后暴力分解质因子并开桶统计一下即可. code: #include < ...

  4. Python中字符串与字节之间相互转换

    Python中字符串与字节之间相互转换 ​ a = b"Hello, world!" # bytes object b = "Hello, world!" # ...

  5. CodeForces 750A New Year and Hurry

    #include<bits/stdc++.h> using namespace std; int main() { int n, k, i, sum; while(~scanf(" ...

  6. docker 部署nestjs应用

    搭建nodejs运行环境,使用了node容器运行 1.安装运行node image docker pull node:latest docker run -itd --name mynode node ...

  7. faster-rcnn CUDA8.0编译错误

    之前编译Faster-RCNN的时候用的都是CUDA7.5,最近换了机器,变成了CUDA8.0,果然编译出现错误了…… 参考下面这篇博客解决了问题: http://blog.csdn.net/kexi ...

  8. java读取excel文件数据导入mysql数据库

    这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...

  9. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

  10. Mininet系列实验(五):Mininet设置带宽之简单性能测试

    1.实验目的 该实验通过Mininet学习python自定义拓扑实现,可在python脚本文件中设计任意想要的拓扑,简单方便,并通过设置交换机和主机之间链路的带宽.延迟及丢包率,测试主机之间的性能.在 ...