在 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 属性。