目标是实现一个实时转码,可用于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
输入
输出
解复用
解复用选择ffdemux_mpeg2ts,需要考虑到时间戳的问题,见《ffdemux_mpegts中时间戳的处理问题》
解码
对于解码相对比较容易,要求不是很苛刻。
编码
因此对于264选择x264enc,对于mpeg2应该选择ffmpeg,但是需要增加对于多线程的支持,否则实时编码的效果不理想,会经常出现马赛克。
封装
如下命令对于码率控制比较理想,具体原因后续研究:
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插件不支持多线程!!!!
参考资料
手机扫一扫
移动阅读更方便
你可能感兴趣的文章