问题描述
我试图捕获使用Windows 7 @ 720p的一个Blackmagic的DeckLink采集卡的音频和视频,但我不能似乎得到了ffmpeg的命令行设置正确。
I am trying to capture audio and video from a blackmagic decklink capture card using Windows 7 @ 720p, but I cant seem to get the ffmpeg command line settings right.
[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真正-f DSHOW -i视频=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真正-f DSHOW -i音频=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
最后,我需要在屏幕上显示这部影片。同时能够开始和停止录制,而preVIEW继续播放。
Ultimately I will need to display this video on screen. And simultaneously be able to start and stop recording, while the preview keeps playing.
我的想法是使用FFMPEG捕捉的视频和音频信号,并且发送给网络流(例如127.0.0.1:6666)。然后使用VLC播放器显示流(在preVIEW)。并最终启动和/或停止其他的ffmpeg保存相同的流盘。
My idea was to use ffmpeg to capture the video and audio signal and transmit this to a network stream (eg 127.0.0.1:6666). Then use VLC player to display the stream (the preview). And ultimately start and/or stop another ffmpeg to save that same stream to disk.
在我的脑海里工作的,但我没有音频/视频专家,所以,如果任何人有更多的经验可以帮帮忙,我想AP preciate它。
In my mind this works, but I am no audio/video expert so if anyone with more experience could help out, I would appreciate it.
更新:
我已经能够通过显示的ffplay视频,用下面的命令:
I have been able to display the video using ffplay, with the following command :
ffplay -f dshow -video_size 1280x720 -rtbufsize 702000k -framerate 60 -i video="Decklink Video Capture":audio="Decklink Audio Capture" -threads 2
下一步是流,所以我可以用VLC观看流(preVIEW)。
Next step is streaming it so I can view the stream (preview) with 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我得到以下错误流:
Which does not give any errors, so appears to work. But when I try to open the stream in VLC I get the following error :
SDP要求:
在SDP格式的描述也需要接受RTP流。需要注意的是RTP://的URI不能与动态RTP负载格式(65)正常工作
SDP required:A description in SDP format is required to receive the RTP stream. Note that rtp:// URIs cannot work with dynamic RTP payload format (65).
在一点点阅读看来我不应该被分流到RTP://而是UDP://
After a bit of reading it seems I should not be streaming to rtp:// but rather to 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我没有得到任何错误,没有警告,也没有视频。
And when I try to open it now in VLC I get no error, no warning, but also no video.
时间对于一些更多的阅读。
Time for some more reading.
推荐答案
终于得到了它的工作。我的设置有这一切都在一台机器上运行。
Finally got it working. My setup has this all running on a single machine.
有关采取视频和通过UDP服务它我用下面的命令:
For taking the video and serving it via UDP I use the following command :
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的来源,这是它
- rtbufsize 702000k是非常重要的,因为如果没有它,实时缓冲区会满在几秒钟的事。
- - 帧率60告诉FFmpeg的源使用60fps的
- 选项:视频=DeckLink系列视频捕获:音效=DeckLink系列音频捕获告诉FFmpeg作为输入,但以这种方式指定它们使用这些设备,音频和视频之间的滞后会大幅减少(与/或消失)。
- - R 30强制输出为30fps的,而不是在源60fps的 。
- - 线程4。确实你的想法,使用4个线程
- 。 - V codeC libx264恩codeS源数据流,同时广播H264
- - CRF 0设置恒定速率因子(量化比例)为0,表示无损 。
- - preSET超快是指我们没有任何耐心,所以使用尽可能少的COM pression越好。这将导致高比特率,但对我的目的很好。
- - ˚FMPEGTS选项告诉FFmpeg使用MPEG-TS包,这将力的ffmpeg使用恒定比特率的MPEG格式,因为MPEG本身通常是可变比特率
- 最后的选择UDP://239.255.12.42:6666指定我们要使用端口6666通过UDP广播此流的组播地址239.255.12.42。我选择在这里使用多播地址的原因很简单,因为我需要显示在同一时间流(preVIEW)和记录,以作为处理至少尽可能。此prevents我从具有到音频和视频流复制到两个不同的网络地址。
有关使用VLC播放器拍摄这段视频,我打开以下网络流媒体地址:
For capturing this video using VLC player, I open the following network streaming address :
udp://@239.255.12.42:6666
最后记录的流我生成一个新的进程,并发出以下命令:
Finally for recording the stream I spawn a new process and issue the following command :
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,我们需要的所有数据流(包括视频和音频)。
- 中的-a codeC复制和-v codeC复制在那里,以确保流被视为是,而不是做任何COM pression /转码。
唯一剩下要做的(这是正在进行ATM作品)正在为这一个C#GUI。基本工作流程将产卵流过程中的形式加载时。使用VLC COM +控件来显示应用程序中的视频。
The only thing left to do (which is a work in progress atm) is creating a c# gui for this. Basic workflow will be to spawn the stream process when the form loads. Use the vlc com+ control to display the video in the application.
然后,当记录按钮被按下,产生另一个进程来记录并停止该进程结束录制。
Then when the record button is pushed, spawn another process to record and stop that process to end the recording.
然而,我停止流时,我开始记录,这使得记录/检测走得更加顺畅。如果流停留在我开始录制这将需要一些时间录制过程才能到流中调。通过停止流,启动记录(这将什么也不做,直到流是回),并重新开始流时,录音将从第一帧拍摄没有任何问题。
I do however stop the stream when I start to record, this makes the recording/detection go much more smoothly. If the stream stays on and I start recording it will take some time before the recording process can "tune in" to the stream. By stopping the stream, starting the recording (which will do nothing until the stream is back on) and starting the stream again, the recording will pickup from the first frame without any problems.
这个小的延迟/闪烁是我的目的,完全可以接受的。
This small delay/flicker is totally acceptable for my purposes.
这篇关于从使用Windows 7的DeckLink采集卡(和录音)音频和视频在720p的ffmpeg的命令行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!