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

我正在尝试从使用 Windows 7 @ 720p的黑色甲板链接捕获卡捕获音频和视频,但是我似乎无法获得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 Video 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

ffmpeg -list_options true -f dshow -i audio =“Decklink Audio Capture”

[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:
需要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中打开它,我没有错误,没有警告,也没有视频.

时间多一些阅读

终于让它工作了我的设置有一个运行在一台机器上.

为了拍摄视频并通过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 1280×720”设置源大小,因为我使用的是720p60源码,就是这样.
>“rtbufsize 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副本”和“-vcodec副本”是为了确保流被按照原样取代,而不是进行任何压缩/转码.

剩下的唯一的事情(这是一个正在进行的工作),为此创建一个c#gui.基本工作流将在表单加载时产生流过程.使用vlc com控件在应用程序中显示视频.

然后当记录按钮被按下时,产生另一个进程来记录和停止该进程以结束记录.

当我开始录制时,我会停止播放,这样录音/检测就会更顺利.如果流保持开启并且我开始录制,则在记录过程可以“调入”流之前需要一些时间.通过停止流,开始录制(直到流重新启动才会什么都不做),并再次启动流,录制将从第一帧获取,没有任何问题.

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

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...