一、过程简述:
1、首先涉及到的插件式textoverlay,该插件中会探测流媒体是否包含字幕,如果有字幕将会调用pango与Cairo库,将字幕字符串转化为图片,以compositon为处理单元与视频buffer一起传递下去。
2.在vaapisink端,将会调用VaAssociate(),将字幕图片与视频帧融合在一块,一起显示。
二、性能提升:
在原理设计的基础上进行修改,之前的设计在显示每一帧的时候都会在video memory中创建一个subpicture,这种操作会导致大量的数据从system memory 中copy到video memory中,导致了只要有字幕出现,cpu的占用率都会提高很多,因此会耗费很多的资源。
改进:在每个视频surface中只要发现字幕不一样便会去创建subpicture,否则直接返回,这样同一个字幕创建的个数也就等于视频surface的个数,大大提高了之前每一帧都会去创建效率。
同时显示两种字幕流命令:
gst-launch-0.10 filesrc location=/root/video_test/DarkShadows_2ch_6ch_FIGS_17Tracks.mp4 ! \
qtdemux name=dmx \
multiqueue name=mq \
textoverlay name=tone \
textoverlay name=ttwo valignment=2 \
dmx.video_00 ! mq.sink0 mq.src0 ! vaapidecode ! tone.video_sink \
dmx.audio_00 ! mq.sink1 mq.src1 ! queue ! faad ! alsasink \
dmx.subtitle_00 ! mq.sink2 mq.src2 ! tone.text_sink \
dmx.subtitle_01 ! mq.sink3 mq.src3 ! ttwo.text_sink \
tone.src ! ttwo.video_sink ttwo.src ! vaapisink
原文地址:http://eminzhang.blog.51cto.com/5292425/1586509