zoukankan      html  css  js  c++  java
  • 【miscellaneous】基于gstreamer的实时转码

    目标是实现一个实时转码,可用于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

  • 相关阅读:
    查询中常用的扩展方法
    加载关联表的数据 显式加载
    加载关联表的数据 延迟加载
    加载关联表的数据 贪婪加载
    操作内存中的数据
    DBContext基础查询
    EF简单增删改查
    1- MySQL数据库基础快速入门
    1-3 Postman 注册账号与登录
    1-2 postman工具简介
  • 原文地址:https://www.cnblogs.com/huty/p/8517519.html
Copyright © 2011-2022 走看看