我正在尝试使用Windows 7 @ 720p从blackmagic decklink采集卡捕获音频和视频,但我似乎无法正确获取ffmpeg命令行设置。
[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"
[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
[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
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: 需要SDP格式的描述来接收RTP流。请注意,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中打开它时,我没有错误,没有警告,也没有视频。
更多时间阅读。
答案 0 :(得分:31)
终于搞定了。我的设置全部在一台机器上运行。
要拍摄视频并通过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
指定我们要使用端口6666 over udp将此流广播到多播地址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
用于确保按原样获取流,而不是进行任何压缩/转码。唯一要做的事情(这是一项正在进行的工作)是为此创建一个c#gui。基本工作流程将在表单加载时生成流进程。使用vlc com + control在应用程序中显示视频。
然后当按下录制按钮时,产生另一个进程以记录并停止该进程以结束录制。
然而,当我开始录制时,我确实停止了流,这使录制/检测变得更加顺畅。如果流保持打开并且我开始录制,则在录制过程可以“调入”到流之前需要一些时间。通过停止流,开始录制(直到流重新开始才会执行任何操作)并再次启动流,录制将从第一帧开始拾取而没有任何问题。
这种小延迟/闪烁对我来说完全可以接受。