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

请教 FFMPEG 和录屏的问题

  •  
  •   Yeen · 76 天前 · 1845 次点击
    这是一个创建于 76 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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