0%

intervideosrc和intervideosink的使用总结

intervideosrc和intervideosink的使用总结

保证视频流不断的方法

输入视频为MP4

1
2
3
4
//输入MP4 视音频分离 单独处理  成功 intervideosink

gst-launch-1.0 filesrc location=1.mp4 ! qtdemux name=demux \
demux.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c1 intervideosrc channel=c1 ! queue ! xvimagesink

命令分析:

  • filesrc:输入源为文件
  • qtdemux:MP4文件要用qtdemux分离视频和音频

分离视音频和单独处理视频。然后把分离后的视频当做src,intervideosink channel=c1用来接收到分离后的视频。然后再把intervideosrc channel=c1当做src,xvimagesink用来接收intervideosrc的数据源。这样当你的filesrc断掉的话intervideosrc并不会断掉,这样就保证了断流的安全。没流的情况下会继续播放黑屏,而不是程序崩溃。

注意

demux后分别处理视音频的时候要decodebin然后在执行videoconvert、videoscale的操作。

videomixer结合intervideosrc和sink保证不断流测试

测试通过 一个输入源为文件视频另外一个为文件视频流:测试通过 输出在屏幕上

1
2
3
4
5
gst-launch-1.0 filesrc location=1.mp4 ! qtdemux name=demux1 demux1.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c1 intervideosrc channel=c1 ! \
video/x-raw,format =I420, framerate=25/1, width=1280, height=720 ! \
videomixer name=mix sink_0::alpha=1 sink_0::xpos=0 sink_0::ypos=0 sink_1::alpha=0.3 sink_1::xpos=150 sink_1::ypos=150 ! videoconvert ! timeoverlay ! ximagesink \
filesrc location=1.mp4 ! qtdemux name= demux2.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c2 intervideosrc channel=c2 ! \
video/x-raw,format=I420, framerate=25/1, width=1280, height=720 ! mix.

测试通过 一个输入源为文件视频另外一个为文件视频流:测试通过 输出在rtmp上

1
2
3
4
5
gst-launch-1.0 filesrc location=1.mp4 ! qtdemux name=demux1 demux1.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c1 intervideosrc channel=c1 ! \
video/x-raw,format =I420, framerate=25/1, width=1280, height=720 ! \
videomixer name=mix sink_0::alpha=1 sink_0::xpos=0 sink_0::ypos=0 sink_1::alpha=0.3 sink_1::xpos=150 sink_1::ypos=150 ! videoconvert ! timeoverlay ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://192.168.18.188/live/888' \
filesrc location=1.mp4 ! qtdemux name=demux2 demux2.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c2 intervideosrc channel=c2 ! \
video/x-raw,format=I420, framerate=25/1, width=1280, height=720 ! mix.

修改视频分辨率

1
2
3
4
5
gst-launch-1.0 filesrc location=1.mp4 ! qtdemux name=demux1 demux1.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! videorate ! video/x-raw,format =I420, framerate=25/1, width=640, height=360 ! intervideosink channel=c1 intervideosrc channel=c1 ! \
video/x-raw,format =I420, framerate=25/1, width=640, height=360 ! \
videomixer name=mix sink_0::alpha=1 sink_0::xpos=0 sink_0::ypos=0 sink_1::alpha=0.3 sink_1::xpos=150 sink_1::ypos=150 ! videoconvert ! timeoverlay ! ximagesink \
filesrc location=1.mp4 ! qtdemux name= demux2.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c2 intervideosrc channel=c2 ! \
video/x-raw,format=I420, framerate=25/1, width=1280, height=720 ! mix.
1
2
3
4
5
6

gst-launch-1.0 filesrc location=1.mp4 ! qtdemux name=demux1 demux1.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! videorate ! video/x-raw,format =I420, framerate=25/1, width=640, height=360 ! intervideosink channel=c1 intervideosrc channel=c1 ! \
video/x-raw,format =I420, framerate=25/1, width=640, height=360 ! \
videomixer name=mix sink_0::alpha=1 sink_0::xpos=0 sink_0::ypos=0 sink_1::alpha=0.3 sink_1::xpos=150 sink_1::ypos=150 ! videoconvert ! videoscale ! videorate ! video/x-raw,format =I420, framerate=25/1, width=1920, height=1080 ! timeoverlay ! x264enc ! flvmux streamable=true ! queue ! rtmpsink location='rtmp://192.168.18.188/live/888' \
filesrc location=1.mp4 ! qtdemux name= demux2.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! intervideosink channel=c2 intervideosrc channel=c2 ! \
video/x-raw,format=I420, framerate=25/1, width=1280, height=720 ! mix.

videorate用来改变视频分辨率。后面跟video/x-raw,format =I420, framerate=25/1, width=640, height=360然后保证intervideosrc作为videomixer的输入的时候也要保证相同的分辨率。