在 GStreamer 中混合时,视频比音频快得多
Video is much faster than audio when muxed in GStreamer
我正在尝试学习录制 X11 windows' 的内容来为 Youtube 做游戏截屏。这应该是一个比较琐碎的任务,但是却已经吃饱了一个晚上。现在我已经了解了一些关于混合和排队的知识(使用 gst-launch
),但问题仍然存在:当我将音频和视频混合成 avi 时,视频播放速度比音频快几倍 在结果文件中。这意味着视频很快结束并静止,而音频继续在背景中喋喋不休。
这是导致问题的我的过滤器链:
gst-launch-1.0 ximagesrc xid=$XID ! video/x-raw,framerate=30/1 ! videoconvert !
x264enc ! queue ! avimux name=mux ! queue ! filesink location=out.avi
pulsesrc device=$DEV ! queue ! audioconvert !
lamemp3enc bitrate=192 ! queue ! mux.
但是,当我只有视频时,问题就消失了,并且以完全正常的速度播放:
ximagesrc xid=0x0820000b ! video/x-raw,framerate=30/1 ! videoconvert !
x264enc ! avimux ! filesink location=out.avi
如果您纠正我 ! queue !
的用法,我将不胜感激。哪里需要?在当前的设置中,我几乎从来没有收到样本被丢弃的警告。
更新: 我更愿意使用 mp4 muxer,但它会生成缺少 moov atom 的无法播放的文件。 Youtube 建议将它放在文件的开头,我是否可以使用 mp4 muxer 强制它?
gst-launch-1.0 ximagesrc xid=$XID ! video/x-raw,framerate=30/1 ! queue !
videoconvert ! videorate ! queue ! x264enc ! queue ! avimux name=mux !
queue ! filesink location=out.avi pulsesrc device=$DEV ! queue !
audioconvert ! queue ! lamemp3enc bitrate=192 ! queue ! mux.
以上管道应该以适当的速度播放音频视频。
I would also appreciate if you correct me on the usage of ! queue !.
Where is it needed? In the current setup I almost never get warnings
that samples were dropped.
队列只是缓冲区,需要在一个元素较慢而另一个元素较快的地方使用,例如视频生成 (ximagesrc) 与 x264enc(软件编码)相比要快得多,因此您可以添加它们之间的队列,以便缓冲区不会被丢弃。
gst-launch-1.0 ximagesrc ! video/x-raw,framerate=30/1 ! queue !
videoconvert ! queue ! x264enc key-int-max=5 ! queue ! mp4mux
name=mux reserved-bytes-per-sec=100
reserved-max-duration=20184000000000
reserved-moov-update-period=100000000 ! queue ! filesink
location=out.mp4 audiotestsrc ! queue ! audioconvert ! queue !
lamemp3enc bitrate=192 ! queue ! mux.
上面的管道将创建一个 mp4 文件 mp4mux,但 moov 原子本身将在末尾还要注意确保根据需要更改 mp4mux 属性。
我正在尝试学习录制 X11 windows' 的内容来为 Youtube 做游戏截屏。这应该是一个比较琐碎的任务,但是却已经吃饱了一个晚上。现在我已经了解了一些关于混合和排队的知识(使用 gst-launch
),但问题仍然存在:当我将音频和视频混合成 avi 时,视频播放速度比音频快几倍 在结果文件中。这意味着视频很快结束并静止,而音频继续在背景中喋喋不休。
这是导致问题的我的过滤器链:
gst-launch-1.0 ximagesrc xid=$XID ! video/x-raw,framerate=30/1 ! videoconvert !
x264enc ! queue ! avimux name=mux ! queue ! filesink location=out.avi
pulsesrc device=$DEV ! queue ! audioconvert !
lamemp3enc bitrate=192 ! queue ! mux.
但是,当我只有视频时,问题就消失了,并且以完全正常的速度播放:
ximagesrc xid=0x0820000b ! video/x-raw,framerate=30/1 ! videoconvert !
x264enc ! avimux ! filesink location=out.avi
如果您纠正我 ! queue !
的用法,我将不胜感激。哪里需要?在当前的设置中,我几乎从来没有收到样本被丢弃的警告。
更新: 我更愿意使用 mp4 muxer,但它会生成缺少 moov atom 的无法播放的文件。 Youtube 建议将它放在文件的开头,我是否可以使用 mp4 muxer 强制它?
gst-launch-1.0 ximagesrc xid=$XID ! video/x-raw,framerate=30/1 ! queue ! videoconvert ! videorate ! queue ! x264enc ! queue ! avimux name=mux ! queue ! filesink location=out.avi pulsesrc device=$DEV ! queue ! audioconvert ! queue ! lamemp3enc bitrate=192 ! queue ! mux.
以上管道应该以适当的速度播放音频视频。
I would also appreciate if you correct me on the usage of ! queue !. Where is it needed? In the current setup I almost never get warnings that samples were dropped.
队列只是缓冲区,需要在一个元素较慢而另一个元素较快的地方使用,例如视频生成 (ximagesrc) 与 x264enc(软件编码)相比要快得多,因此您可以添加它们之间的队列,以便缓冲区不会被丢弃。
gst-launch-1.0 ximagesrc ! video/x-raw,framerate=30/1 ! queue ! videoconvert ! queue ! x264enc key-int-max=5 ! queue ! mp4mux name=mux reserved-bytes-per-sec=100 reserved-max-duration=20184000000000 reserved-moov-update-period=100000000 ! queue ! filesink location=out.mp4 audiotestsrc ! queue ! audioconvert ! queue ! lamemp3enc bitrate=192 ! queue ! mux.
上面的管道将创建一个 mp4 文件 mp4mux,但 moov 原子本身将在末尾还要注意确保根据需要更改 mp4mux 属性。