Hur*_*ron 16 audio video ffmpeg
我正在尝试使用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"
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Ultimately I will need to display this video on screen. And simultaneously be able to start and stop recording, while the preview keeps playing.
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.
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.
Update:
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
Run Code Online (Sandbox Code Playgroud)
Next step is streaming it so I can view the stream (preview) with VLC.
Tried to use this command :
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
Run Code Online (Sandbox Code Playgroud)
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:接收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
Run Code Online (Sandbox Code Playgroud)
当我尝试在VLC中打开它时,我没有错误,没有警告,也没有视频.
是时候多读一些了.
Hur*_*ron 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"
Run Code Online (Sandbox Code Playgroud)
-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
Run Code Online (Sandbox Code Playgroud)
最后,为了记录流我生成一个新进程并发出以下命令:
ffmpeg -y -threads 4 -i udp://239.255.12.42:6666 -map 0 -acodec copy -vcodec copy output.mkv
Run Code Online (Sandbox Code Playgroud)
-y选项用于始终覆盖文件(如果文件存在且没有问题).-threads 4选项符合您的想法,它使用4个线程.-i udp://239.255.12.42:6666连接到该流,我们广播.-map 0告诉FFmpeg,我们需要所有的流(视频和音频).-acodec copy和-vcodec copy是否有保证,而不是做任何压缩/转码的流被视为是,.剩下要做的唯一事情(这是一项正在进行的工作)是为此创建ac#gui.基本工作流程将在表单加载时生成流进程.使用vlc com + control在应用程序中显示视频.
然后,当按下记录按钮时,产生另一个进程以记录并停止该进程以结束记录.
然而,当我开始录制时,我确实停止了流,这使得录制/检测变得更加顺畅.如果流保持打开并且我开始录制,则在录制过程可以"调入"到流之前需要一些时间.通过停止流,开始记录(在流重新开启之前不会做任何事情)并再次启动流,记录将从第一帧中拾取而没有任何问题.
这个小延迟/闪烁对我来说是完全可以接受的.