首页 > 解决方案 > 在 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 强制它吗?

标签: command-linegstreamervideo-captureaudio-recordingmuxer

解决方案


gst-launch-1.0 ximagesrc xid=$XID !视频/x-raw,帧率=30/1!队列 !视频转换!视频速率!队列 !x264enc !队列 !avimux 名称=多路复用器!队列 !文件接收器位置=out.avi pulsesrc 设备=$DEV !队列 !音频转换!队列 !lamemp3enc 比特率=192 !队列 !多路复用器。

上述管道应该以适当的速度播放音频视频。

如果您纠正我的用法,我也将不胜感激!队列 !。哪里需要?在当前设置中,我几乎从未收到样本被丢弃的警告。

queue 只是缓冲区,它们需要在一个元素较慢和一个元素较快的地方使用,因此例如视频生成(ximagesrc)与 x264enc(软件编码)相比要快得多,因此您可以在它们之间添加一个队列以免缓冲区被丢弃。

gst-launch-1.0 ximagesrc !视频/x-raw,帧率=30/1!队列 !视频转换!队列 !x264enc key-int-max=5 !队列 !mp4mux 名称=mux 保留字节每秒=100 保留最大持续时间=20184000000000 保留moov-更新周期=100000000 !队列 !文件接收器位置=out.mp4 audiotestsrc !队列 !音频转换!队列 !lamemp3enc 比特率=192 !队列 !多路复用器。

上面的管道将创建一个 mp4 文件 mp4mux,但 moov atom 本身将在最后,请注意确保您根据需要更改mp4mux属性。


推荐阅读