V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Yeen
V2EX  ›  程序员

请教 FFMPEG 和录屏的问题

  •  
  •   Yeen · 2022-07-19 09:50:05 +08:00 · 2864 次点击
    这是一个创建于 864 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚接触 ffmpeg ,不太熟悉。 最近在使用 ffmpeg-cli 方式录制 winows 系统的屏幕录制,gdigrap 视频+dshow 音频方式。 发现话筒声音与视频不同步(但视频与系统音源是同步的),话筒声音滞后 300-500ms 左右。 该如何 fix 呢? 劳烦大佬来解答一下。

    大家一起讨论讨论,视频处理这块算是比较有技术含量的,个人感觉也是比较有趣可以深做的方向。

    36 条回复    2022-07-21 15:48:12 +08:00
    tpxcer
        1
    tpxcer  
       2022-07-19 10:15:08 +08:00
    我想请教下,有 OBS 这种为什么还要用命令行呢? 画质更好?
    documentzhangx66
        2
    documentzhangx66  
       2022-07-19 10:33:56 +08:00
    1.音画不同步是正常的,同步了才是稀罕事。

    2.专业的处理方法是,录制时,视频流与音频流分开,最后合并时,让用户自己确定时差,最后带上时差来合并视频流与音频流。
    Yeen
        3
    Yeen  
    OP
       2022-07-19 10:34:21 +08:00
    @tpxcer OBS 是什么,以前没有搞过视频处理这块。。。。
    Yeen
        4
    Yeen  
    OP
       2022-07-19 10:35:18 +08:00
    @documentzhangx66 请教有没有 ffmepg cli 的命令样例,感谢!
    wy315700
        5
    wy315700  
       2022-07-19 10:47:50 +08:00
    像影视公司那样,弄个场面版,开始的时候咔一下。后期剪辑的时候就很方便对准了
    Vaspike
        6
    Vaspike  
       2022-07-19 10:49:04 +08:00
    Yeen
        7
    Yeen  
    OP
       2022-07-19 10:55:38 +08:00
    @wy315700 有没有简单的处理方案呢?
    webrtc 混合流貌似同步的就很好,ffmpeg 反而时间不同步。。。。。
    ysc3839
        8
    ysc3839  
       2022-07-19 11:38:21 +08:00 via Android   ❤️ 2
    建议直接用 OBS 。
    如果是要集成到自己软件里的话,用 gstreamer 的 d3d11screencapturesrc 和 wasapi2src 来录音视频。GDI 和 DirectShow 是过时的 API 了,性能很差。
    Yeen
        9
    Yeen  
    OP
       2022-07-19 11:39:25 +08:00
    @ysc3839 好的,我试试
    Yeen
        10
    Yeen  
    OP
       2022-07-19 12:22:03 +08:00
    @ysc3839 这块有没有学习资料或者网站推荐一下呢?
    ysc3839
        11
    ysc3839  
       2022-07-19 12:37:40 +08:00 via Android
    @Yeen 官方文档?
    Yeen
        12
    Yeen  
    OP
       2022-07-19 16:15:07 +08:00
    经过测试,发现是 amix 后,只要混入话筒,就会音画不同步。如果只有声卡,没有用 amix 混合,就不存在这个问题。感觉应该可以通过设置 ffmpeg cli 的参数解决。如果能先简单解决最好了~
    在线等
    Yeen
        13
    Yeen  
    OP
       2022-07-19 16:31:18 +08:00
    @documentzhangx66 能不能通过一条 ffmpeg 的命令行就实现这个过程呢?请教
    cwaken
        14
    cwaken  
       2022-07-19 18:52:58 +08:00 via iPhone
    同步是一件很复杂的事
    cwaken
        15
    cwaken  
       2022-07-19 18:53:29 +08:00 via iPhone
    音频和视频的帧率不一样
    Yeen
        16
    Yeen  
    OP
       2022-07-19 19:02:09 +08:00
    @cwaken 但是系统声音就很好的和画面同步,话筒就不行。能不能强制他们用某种方式对齐呢?
    cwaken
        17
    cwaken  
       2022-07-19 19:04:21 +08:00 via iPhone
    @Yeen 可以,api 手动计算 pts
    cwaken
        18
    cwaken  
       2022-07-19 19:04:50 +08:00 via iPhone
    你要是用命令,建议走 obs
    Yeen
        19
    Yeen  
    OP
       2022-07-19 19:08:02 +08:00
    通过调整 ffmepg cli 的命令参数没有办法吗...
    cwaken
        20
    cwaken  
       2022-07-19 19:15:12 +08:00 via iPhone
    音视频同步反而是在解码端实现的,但视频音频的 pts 都要对齐
    Salticey
        21
    Salticey  
       2022-07-19 19:17:05 +08:00 via Android
    如果是 windows 且用独立显卡的话,可以直接使用独显自带的录屏呀,很好用的
    cssk
        22
    cssk  
       2022-07-19 19:21:48 +08:00 via iPhone
    @ysc3839 #8 搭车一问,directshow 过时了,那么写个 uvc 摄像头的软件用什么比较好,amcap 是用 directshow 的
    Yeen
        23
    Yeen  
    OP
       2022-07-19 19:48:57 +08:00
    @cwaken 有没有命令行参数可以让 3 个 -i 流的 pts 对齐呢?
    Yeen
        24
    Yeen  
    OP
       2022-07-19 19:49:50 +08:00
    说实话,webrtc 除了编码格式较少不能输出 mp4 ,控制参数不灵活。其他方面倒还蛮好的
    ysc3839
        25
    ysc3839  
       2022-07-19 20:53:11 +08:00 via Android
    @cssk Media Foundation 。但是很多虚拟摄像头还是用 DirectShow 实现的,换成 MF 之后用不了。所以选啥自己考虑吧。
    610915518
        26
    610915518  
       2022-07-19 21:25:40 +08:00
    OBS 大法好
    cwaken
        27
    cwaken  
       2022-07-20 00:29:16 +08:00 via iPhone
    每个 pcm 数据 yuv 数据的 pts 值都是通过公式计算得来的
    cwaken
        28
    cwaken  
       2022-07-20 00:32:15 +08:00 via iPhone
    我以前还有个同事为了高性能录制,写了个声卡虚拟驱动,为的就是录制时降噪和回音抑制
    cwaken
        29
    cwaken  
       2022-07-20 00:35:04 +08:00 via iPhone
    我是没这么做,我在另一个项目里是先从声卡数据采集,因为人不可能一直在说,所以先把数据和 pts 放到生产者队列。然后取出来再走音频算法,把 pts 设置上去,播放的时候也是同步的
    cwaken
        30
    cwaken  
       2022-07-20 00:35:36 +08:00 via iPhone
    没有人声的时候就把累积的全部处理
    cwaken
        31
    cwaken  
       2022-07-20 00:38:58 +08:00 via iPhone
    cli 基本没什么用,在商业项目中情况复杂,兼容不了特殊情况
    Yeen
        32
    Yeen  
    OP
       2022-07-20 08:14:58 +08:00
    @cwaken 不能一边采集,一边编码,同时同步吗
    cwaken
        33
    cwaken  
       2022-07-20 08:59:44 +08:00 via iPhone
    @Yeen 你先查下同步是个啥问题
    Yeen
        34
    Yeen  
    OP
       2022-07-20 09:27:42 +08:00
    @cwaken 新进展:在混入麦克风时候,给视频流加了 0.4 秒的 offset 延迟,那么声卡,视频,话筒,就就能同步了。我感觉这个问题应该还不是复杂的同步问题。因为是保存本地文件,不是实时推流那么复杂的吧?
    documentzhangx66
        35
    documentzhangx66  
       2022-07-21 15:38:03 +08:00   ❤️ 1
    @Yeen

    1.不能一条命令解决,我在前面说了,需要专业人士来分析出具体延迟时间,然后在合并时进行处理。

    2.这里的关键是,需要分析出延迟到底是多少。不同电脑,在不同负载下,延迟时间可能会不一样。甚至在录制过程中,延迟时间还有可能会发生变化。
    Yeen
        36
    Yeen  
    OP
       2022-07-21 15:48:12 +08:00
    @documentzhangx66 查阅了一下资料,应该是麦克风输入缓存延迟的问题。暂时解决了,感谢回复~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:42 · PVG 22:42 · LAX 06:42 · JFK 09:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.