gpt4 book ai didi

audio - 使用 Windows 7 从 decklink 卡捕获(和记录)720p 音频和视频的 ffmpeg 命令行

转载 作者:行者123 更新时间:2023-11-28 21:38:52 25 4
gpt4 key购买 nike

我正在尝试使用 Windows 7 @ 720p 从 blackmagic decklink 采集卡采集音频和视频,但我似乎无法正确设置 ffmpeg 命令行。

ffmpeg -list_devices true -f dshow -i dummy
[dshow @ 02457a60] DirectShow video devices
[dshow @ 02457a60] "Blackmagic WDM Capture"
[dshow @ 02457a60] "Decklink Video Capture"
[dshow @ 02457a60] DirectShow audio devices
[dshow @ 02457a60] "Decklink Audio Capture"

ffmpeg -list_options true -f dshow -i video="Decklink 视频采集"

[dshow @ 03c2ea20] DirectShow video device options
[dshow @ 03c2ea20] Pin "Capture"
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=720x486 fps=29.97 max s=720x486 fps=29.97
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=720x486 fps=23.976 max s=720x486 fps=23.976
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=720x576 fps=25 max s=720x576 fps=25
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=720x486 fps=59.9402 max s=720x486 fps=59.9402
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=720x576 fps=50 max s=720x576 fps=50
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1920x1080 fps=23.976 max s=1920x1080 fps=23.976
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1920x1080 fps=24 max s=1920x1080 fps=24
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1920x1080 fps=25 max s=1920x1080 fps=25
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1920x1080 fps=29.97 max s=1920x1080 fps=29.97
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1920x1080 fps=30 max s=1920x1080 fps=30
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1280x720 fps=50 max s=1280x720fps=50
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1280x720 fps=59.9402 max s=1280x720 fps=59.9402
[dshow @ 03c2ea20] pixel_format=uyvy422 min s=1280x720 fps=60.0002 max s=1280x720 fps=60.0002

ffmpeg -list_options true -f dshow -i audio="Decklink 音频采集"

[dshow @ 047fea20] DirectShow audio device options
[dshow @ 047fea20] Pin "Capture"
[dshow @ 047fea20] min ch=1 bits=16 rate= 48000 max ch=1 bits=16 rate= 48000
[dshow @ 047fea20] min ch=2 bits=16 rate= 48000 max ch=2 bits=16 rate= 48000
[dshow @ 047fea20] min ch=4 bits=16 rate= 48000 max ch=4 bits=16 rate= 48000
[dshow @ 047fea20] min ch=6 bits=16 rate= 48000 max ch=6 bits=16 rate= 48000
[dshow @ 047fea20] min ch=8 bits=16 rate= 48000 max ch=8 bits=16 rate= 48000
[dshow @ 047fea20] min ch=10 bits=16 rate= 48000 max ch=10 bits=16 rate= 48000
[dshow @ 047fea20] min ch=12 bits=16 rate= 48000 max ch=12 bits=16 rate= 48000
[dshow @ 047fea20] min ch=16 bits=16 rate= 48000 max ch=16 bits=16 rate= 48000

这是我当前视频/音频源的流信息,连接到 decklink 卡的 hdmi 端口

Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422(tv), 1280x720, 59.94 tbr, 10000k tbn, 59.94 tbc
Stream #0:1: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s

最终我需要在屏幕上显示该视频。并且能够同时开始和停止录制,同时预览继续播放。

我的想法是使用 ffmpeg 捕获视频和音频信号并将其传输到网络流(例如 127.0.0.1:6666)。然后使用 VLC 播放器显示流(预览)。并最终启动和/或停止另一个 ffmpeg 以将相同的流保存到磁盘。

在我看来这是可行的,但我不是音频/视频专家,所以如果有更多经验的人可以提供帮助,我将不胜感激。

更新:

我已经能够使用 ffplay 显示视频,使用以下命令:

ffplay -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2

下一步是流式传输,以便我可以使用 VLC 查看流(预览)。

尝试使用这个命令:

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2 -f mpegts rtp://127.0.0.1:6666?pkt_size=188?buffer_size=65535

它没有给出任何错误,因此似乎可以工作。但是当我尝试在 VLC 中打开流时,出现以下错误:

需要 SDP:接收 RTP 流需要 SDP 格式的描述。请注意,rtp://URI 无法使用动态 RTP 负载格式 (65)。

经过一些阅读,我似乎不应该流式传输到 rtp://而应该流式传输到 udp://

命令变为:

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2 -f mpegts udp://127.0.0.1:6666?pkt_size=188?buffer_size=65535

现在当我尝试在 VLC 中打开它时,我没有收到任何错误、警告,但也没有视频。

是时候阅读更多内容了。

最佳答案

终于成功了。我的设置让这一切都在一台机器上运行。

为了通过 UDP 获取视频并提供服务,我使用以下命令:

ffmpeg -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -r 30 -threads 4 -vcodec libx264 -crf 0 -preset ultrafast -f mpegts "udp://239.255.12.42:6666"
  • -f dshow 告诉 ffmpeg 我们需要使用直接显示。
  • -video_size 1280x720 设置源大小,因为我使用的是 720p60 源,就是这样。
  • 702000k 非常重要,因为如果没有它,实时缓冲区将在几秒钟内变满。
  • -framerate 60 告诉 ffmpeg 源正在使用 60fps。
  • 选项:video="Decklink Video Capture":audio="Decklink Audio Capture" 告诉 ffmpeg 使用这些设备作为输入,但是通过以这种方式指定它们,音频和音频之间的延迟视频将大大减少(和/或消失)。
  • -r 30 强制输出为 30fps 而不是源中的 60fps。
  • -threads 4 做你想的,使用 4 个线程。
  • -vcodec libx264 在广播时将源流编码为 h264。
  • -crf 0 将“恒定速率因子”(量化器标度)设置为 0,表示无损。
  • -preset ultrafast 意味着我们没有任何耐心,所以尽可能少地使用压缩。这会导致高比特率,但这对我的目的来说没问题。
  • -f mpegts 选项告诉 ffmpeg 使用 MPEG-TS 数据包,这将“强制”ffmpeg 使用恒定比特率的 mpeg 格式,因为 mpeg 本身通常是可变比特率。
  • 最后,选项 udp://239.255.12.42:6666 指定我们要通过 udp 使用端口 6666 将此流广播到多播地址 239.255.12.42。我在这里选择使用多播地址的原因很简单,因为我需要同时显示流(预览)和记录,并尽可能减少处理。这使我不必将音频和视频流复制到两个不同的网络地址。

为了使用 VLC 播放器捕获此视频,我打开以下网络流媒体地址:

udp://@239.255.12.42:6666

最后,为了记录流,我生成了一个新进程并发出以下命令:

ffmpeg -y -threads 4 -i udp://239.255.12.42:6666 -map 0 -acodec copy -vcodec copy output.mkv
  • -y 选项用于始终覆盖文件(如果文件存在且没有问题)。
  • -threads 4 选项如您所想,它使用 4 个线程。
  • -i udp://239.255.12.42:6666 连接到我们正在广播的流。
  • -map 0 告诉 ffmpeg 我们需要所有流(视频和音频)。
  • -acodec copy-vcodec copy 用于确保流按原样获取,而不是进行任何压缩/转码。

剩下要做的唯一一件事(atm 正在进行的工作)就是为此创建一个 c# gui。基本工作流程将是在加载表单时生成流进程。使用 vlc com+ 控件在应用程序中显示视频。

然后当按下录制按钮时,产生另一个进程来录制并停止该进程以结束录制。

然而,当我开始录制时,我确实停止了流,这使得录制/检测进行得更加顺利。如果流保持开启并且我开始录制,则录制过程需要一些时间才能“调入”流。通过停止流、开始录制(在流重新打开之前不会执行任何操作)并再次启动流,录制将从第一帧开始,没有任何问题。

这个小的延迟/闪烁对于我的目的来说是完全可以接受的。

关于audio - 使用 Windows 7 从 decklink 卡捕获(和记录)720p 音频和视频的 ffmpeg 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com