在Windows 10下,ffmpeg无法抓取通过扬声器播放的音频。

4
我正在使用ffmpeg抓取屏幕。在win7下使用UScreenCapture和virtual-audio-capturer(x86版本)时运行良好。但是在win10中,音频无法被记录。(回放时听不到任何声音)。因为virtual-audio-capturer没有x64版本,所以我使用了ffmpeg/uscreencapture/virtual-audio-capturer的所有win32版本。
我的问题是:如何使用ffmpeg正确地记录视频和音频?
以下是屏幕截图: 首先是我的系统上的直接显示设备。
C:\ffmpeg-20190403-ee16d14-win32-static\bin>ffmpeg -list_devices true -f dshow -i dummy
ffmpeg version N-93528-gee16d14b0a Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20190212
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 48.101 / 58. 48.101
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  7.100 / 58.  7.100
  libavfilter     7. 48.100 /  7. 48.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
[dshow @ 06303ac0] DirectShow video devices (some may be both video and audio devices)
[dshow @ 06303ac0]  "UScreenCapture"
[dshow @ 06303ac0]     Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\UScreenCapture"
[dshow @ 06303ac0] DirectShow audio devices
[dshow @ 06303ac0]  "Microphone Array (Realtek(R) Audio)"
[dshow @ 06303ac0]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{9F102091-1843-44C8-B20E-C6F2E0F11A0F}"
[dshow @ 06303ac0]  "virtual-audio-capturer"
[dshow @ 06303ac0]     Alternative name "@device_sw_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\{8E14549B-DB61-4309-AFA1-3578E927E935}"
dummy: Immediate exit requested

其次,当我使用虚拟音频捕捉器时,ffmpeg就失败了:

C:\ffmpeg-20190403-ee16d14-win32-static\bin>ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone Array (Realtek(R) Audio)" -vf crop=1075:717:189:81 -vcodec mpeg4 -qscale 0 -framerate 60 -acodec libmp3lame -ab 128000 -async 1 output.aviffmpeg -f dshow -i video="UScreenCapture":audio="virtual-audio-capturer" -vf crop=1075:717:189:81 -vcodec mpeg4 -qscale 0 -framerate 60 -acodec libmp3lame -ab 128000 -async 1 output.avi
ffmpeg version N-93528-gee16d14b0a Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20190212
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 26.100 / 56. 26.100
  libavcodec     58. 48.101 / 58. 48.101
  libavformat    58. 26.101 / 58. 26.101
  libavdevice    58.  7.100 / 58.  7.100
  libavfilter     7. 48.100 /  7. 48.100
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, dshow, from 'video=UScreenCapture:audio=Microphone Array (Realtek(R) Audio)':
  Duration: N/A, start: 6333.289000, bitrate: N/A
    Stream #0:0: Video: rawvideo, bgr24, 3200x1080, 15 fps, 15 tbr, 10000k tbn, 10000k tbc
    Stream #0:1: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
IMMDeviceEnumerator::GetDefaultAudioEndpoint failed: hr = 0x80070490
[dshow @ 062f4ac0] real-time buffer [UScreenCapture] [video input] too full or near too full (340% of size: 3041280 [rtbufsize parameter])! frame dropped!

当我使用其他音频设备时,它似乎工作正常,但没有录制到音频。
ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone Array (Realtek(R) Audio)" -vf crop=1075:717:189:81 -vcodec mpeg4 -qscale 0 -framerate 60 -acodec libmp3lame -ab 128000 -async 1 output.avi

    C:\ffmpeg-20190403-ee16d14-win32-static\bin>ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone Array (Realtek(R) Audio)" -vf crop=1075:717:189:81 -vcodec mpeg4 -qscale 0 -framerate 60 -acodec libmp3lame -ab 128000 -async 1 output.avi
    ffmpeg version N-93528-gee16d14b0a Copyright (c) 2000-2019 the FFmpeg developers
      built with gcc 8.2.1 (GCC) 20190212
      configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
      libavutil      56. 26.100 / 56. 26.100
      libavcodec     58. 48.101 / 58. 48.101
      libavformat    58. 26.101 / 58. 26.101
      libavdevice    58.  7.100 / 58.  7.100
      libavfilter     7. 48.100 /  7. 48.100
      libswscale      5.  4.100 /  5.  4.100
      libswresample   3.  4.100 /  3.  4.100
      libpostproc    55.  4.100 / 55.  4.100
    Guessed Channel Layout for Input Stream #0.1 : stereo
    Input #0, dshow, from 'video=UScreenCapture:audio=Microphone Array (Realtek(R) Audio)':
      Duration: N/A, start: 6168.067000, bitrate: N/A
        Stream #0:0: Video: rawvideo, bgr24, 3200x1080, 15 fps, 15 tbr, 10000k tbn, 10000k tbc
        Stream #0:1: Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s
    Please use -q:a or -q:v, -qscale is ambiguous
    Stream mapping:
      Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg4 (native))
      Stream #0:1 -> #0:1 (pcm_s16le (native) -> mp3 (libmp3lame))
    Press [q] to stop, [?] for help
    -async is forwarded to lavfi similarly to -af aresample=async=1:min_hard_comp=0.100000:first_pts=0.
    Output #0, avi, to 'output.avi':
      Metadata:
        ISFT            : Lavf58.26.101
        Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p(progressive), 1075x717, q=2-31, 200 kb/s, 15 fps, 15 tbn, 15 tbc
        Metadata:
          encoder         : Lavc58.48.101 mpeg4
        Side data:
          cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
        Stream #0:1: Audio: mp3 (libmp3lame) (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 kb/s
        Metadata:
          encoder         : Lavc58.48.101 libmp3lame
    frame=    8 fps=0.0 q=0.0 size=     522kB time=00:00:00.53 bitrate=8013.1kbitsframe=   16 fps= 16 q=0.0 size=    1034kB time=00:00:01.06 bitrate=7938.7kbitsframe=   23 fps= 15 q=0.0 size=    1546kB time=00:00:01.53 bitrate=8258.0kbitsframe=   31 fps= 15 q=0.0 size=    2058kB time=00:00:02.06 bitrate=8156.4kbitsframe=   38 fps= 15 q=0.0 size=    2058kB time=00:00:02.53 bitrate=6653.9kbitsframe=   46 fps= 15 q=0.0 size=    2570kB time=00:00:03.06 bitrate=6864.4kbitsframe=   54 fps= 15 q=0.0 size=    3082kB time=00:00:03.60 bitrate=7012.6kbitsframe=   61 fps= 15 q=0.0 size=    3338kB time=00:00:04.06 bitrate=6723.5kbitsframe=   69 fps= 15 q=0.0 size=    3850kB time=00:00:04.60 bitrate=6855.8kbitsframe=   76 fps= 15 q=0.0 size=    4106kB time=00:00:05.06 bitrate=6638.2kbitsframe=   84 fps= 15 q=0.0 size=    4618kB time=00:00:05.60 bitrate=6755.0kbitsframe=   91 fps= 15 q=0.0 size=    4874kB time=00:00:06.06 bitrate=6581.1kbitsframe=   99 fps= 15 q=0.0 size=    5130kB time=00:00:06.60 bitrate=6367.0kbitsframe=  106 fps= 15 q=0.0 size=    5642kB time=00:00:07.06 bitrate=6540.1kbitsframe=  114 fps= 15 q=0.0 size=    6154kB time=00:00:07.66 bitrate=6575.3kbitsframe=  121 fps= 15 q=0.0 size=    6410kB time=00:00:08.13 bitrate=6455.9kbitsframe=  129 fps= 15 q=0.0 size=    6666kB time=00:00:08.66 bitrate=6300.6kbitsframe=  136 fps= 15 q=0.0 size=    6922kB time=00:00:09.13 bitrate=6208.3kbitsframe=  144 fps= 15 q=0.0 size=    7434kB time=00:00:09.66 bitrate=6299.7kbitsframe=  151 fps= 15 q=0.0 size=    7690kB time=00:00:10.13 bitrate=6216.5kbitsframe=  159 fps= 15 q=0.0 size=    7946kB time=00:00:10.66 bitrate=6102.3kbitsframe=  167 fps= 15 q=0.0 size=    8458kB time=00:00:11.20 bitrate=6186.2kbitsframe=  174 fps= 15 q=0.0 size=    8970kB time=00:00:11.66 bitrate=6298.3kbitsframe=  182 fps= 15 q=0.0 size=    8970kB time=00:00:12.20 bitrate=6022.9kbitsframe=  189 fps= 15 q=0.0 size=    9482kB time=00:00:12.66 bitrate=6132.2kbitsframe=  190 fps= 15 q=0.0 Lsize=    9602kB time=00:00:12.73 bitrate=6177.3kbits/s speed=   1x
    video:9382kB audio:194kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.265721%
    [dshow @ 06393f40] real-time buffer [UScreenCapture] [video input] too full or near too full (340% of size: 3041280 [rtbufsize parameter])! frame dropped!
    Exiting normally, received signal 2.

https://github.com/rdp/virtual-audio-capture-grabber-device 对我有用。 - Ilya Serbis
1个回答

1
我终于在Windows 10下找到了解决方案: 麦克风只能通过空气捕获声音,可能会捕获到不想要的声音,并且质量可能不好。幸运的是,我们有另一种解决方案:
1.从https://www.vb-audio.com/Cable/下载VB Cable。 2.解压并以管理员模式运行vbcable_setup.exe。 3.打开声音设置,添加两个设备:播放的Cable输入和录制的Cable输出。 4.将这两个设备设置为默认设备。 5.选择录音设备Cable输出并选择属性。 6.勾选“监听此设备”并将播放设备设置为扬声器。(这样声音最终将传输到扬声器)
完成所有步骤后,运行以下命令进入FFmpeg: ffmpeg -list_devices -f dshow -i dummy 将出现以下设备名称: 'audio-CABLE Output (VB-Audio Virtual Cable)'
使用此设备作为音频捕获设备,问题得到解决。

1
在这篇文章中有一些错误:需要使用vbcable_setup_x64来适配Windows 10 64位操作系统。另外,正确的列出设备命令是:ffmpeg -list_devices true -f dshow -i dummy。对于造成的困扰,我们深感抱歉。 - shangping

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接