command-line - 在 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 !视频/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属性。
推荐阅读
- python - Pygame 延迟问题
- flutter - 如何在颤动中实现由底部减号栏控制的水平滚动
- java - 使用来自 java 7 的 okhttp 3.12.x?
- java - java spring boot中的一对多关系
- flutter - 交错网格视图无法在 2 列中显示数据
- python - matploblib 中的绘图变得嘈杂
- python - 如何在 django 中反转包含 url 的“url”
- python - AWS lambda 中的 Pytest
- java - 无法使用 IdeEventQueue 错误构建应用程序
- java - 如何在运行时暂时失败/禁用 REST API?