我已经花了 24 个小时来解决这个问题,但是遇到了一些困难。
预先信息:我正在运行一个装有 DeckLink Duo 2 卡的 Ubuntu 18.04 服务器。
目标:从 DeckLink Duo 2 捕获视频并将其写入 output.avi
到目前为止我已经尝试过:
我已经在我的 Ubuntu 服务器上安装了 BMD DeckLink 驱动程序 10.11.4(我也尝试编译 11.2,但 ffmpeg 无法编译它)并验证服务器可以看到该卡:
redacted@redacted:~$ BlackmagicFirmwareUpdater status
0: /dev/blackmagic/io0 [DeckLink Duo 2] 0xd5 OK
1: /dev/blackmagic/io2 [DeckLink Duo 2] 0xd5 OK
2: /dev/blackmagic/io1 [DeckLink Duo 2] 0xd5 OK
3: /dev/blackmagic/io3 [DeckLink Duo 2] 0xd5 OK
我已经使用 decklink 和以下配置编译了 ffmpeg:
ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
configuration:
--prefix=/home/redacted/ffmpeg_build
--pkg-config-flags=--static
--extra-cflags='-I/home/redacted/ffmpeg_build/include -I/home/redacted/ffmpeg_sources/BMD_SDK/include'
--extra-ldflags=-L/home/redacted/ffmpeg_build/lib
--extra-libs='-lpthread -lm'
--bindir=/home/redacted/bin
--enable-gpl
--enable-libass
--enable-libfdk-aac
--enable-libfreetype
--enable-libmp3lame
--enable-libopus
--enable-libvorbis
--enable-libvpx
--enable-libx264
--enable-libx265
--enable-nonfree
--enable-decklink
接下来我进行基本检查,看看我的 DeckLink Duo 2 是否出现在 ffmpeg 中:
[decklink @ 0x5574cc33ef00] Blackmagic DeckLink input devices:
[decklink @ 0x5574cc33ef00] 'DeckLink Duo (1)'
[decklink @ 0x5574cc33ef00] 'DeckLink Duo (2)'
[decklink @ 0x5574cc33ef00] 'DeckLink Duo (3)'
[decklink @ 0x5574cc33ef00] 'DeckLink Duo (4)'
dummy: Immediate exit requested
这确认 ffmpeg 可以看到该卡。
所以现在我想运行一个捕获命令,但是,无论我运行什么命令,FFmpeg 都不会开始捕获。例如,运行一个非常基本的命令:
"ffmpeg -format_code Hi50 -f decklink -i 'DeckLink Duo (1)' out.avi"
返回
redacted@redacted:~$ ffmpeg -format_code Hi50 -f decklink -i 'DeckLink
Duo (1)' out.avi
ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
configuration: --prefix=/home/redacted/ffmpeg_build --pkg-config-flags=--static -
-extra-cflags='-I/home/redacted/ffmpeg_build/include -
I/home/redacted/ffmpeg_sources/BMD_SDK/include' --extra-ldflags=-
L/home/redacted/ffmpeg_build/lib --extra-libs='-lpthread -lm' --
bindir=/home/redacted/bin --enable-gpl --enable-libass --enable-libfdk-aac --
enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --
enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --enable-
decklink
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
[decklink @ 0x5638a755d000] Found Decklink mode 1920 x 1080 with rate 25.00(i)
使用 -loglevel trace 运行命令不会产生太多结果。
Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging
level) with argument 'trace'.
Reading option '-raw_format' ... matched as AVOption 'raw_format' with
argument 'yuv422p10'.
Reading option '1' ... matched as output url.
Reading option '-ac' ... matched as option 'ac' (set number of audio
channels) with argument '2'.
Reading option '-format_code' ... matched as AVOption 'format_code' with
argument 'Hp25'.
Reading option '-f' ... matched as option 'f' (force format) with argument
'decklink'.
Reading option '-i' ... matched as input url with argument 'DeckLink Duo
(2)'.
Reading option 'output.avi' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument trace.
Successfully parsed a group of options.
Parsing a group of options: input url DeckLink Duo (2).
Applying option ac (set number of audio channels) with argument 2.
Applying option f (force format) with argument decklink.
Successfully parsed a group of options.
Opening an input file: DeckLink Duo (2).
[decklink @ 0x55cef7de7300] Trying to find mode for frame size 0x0, frame
timing 0/0, field order 0, direction 0, mode number 0, format code Hp25
[decklink @ 0x55cef7de7300] Found Decklink mode 1920 x 1080 with rate 25.00
[decklink @ 0x55cef7de7300] Using 2 input audio channels
无论我将初始命令弄得多么复杂,包括视频格式、音频格式、自定义大小、编解码器等,它们都返回相同的结果。
它基本上停留在这个位置,命令仍然永远运行。据我所知,FFmpeg 应该会立即启动编码过程。但事实并非如此。
我可以确认正常的重新编码命令例如:
redacted@redacted:~$ ffmpeg -i video.mov out.avi
运行良好。所以 FFmpeg 在基本层面上是可以运行的。
我还可以确认 FFmpeg 可以“与 DeckLink 对话”并设置正确的模式,我可以确认图片“流过”卡,因为我可以看到它出现在我的显示器的输出循环中,但是,只要我输入任何 FFmpeg 命令,FFmpeg 就不会开始编码/捕获。
我认为我在 FFmpeg 的配置/编译方面做错了什么,也许是在编译过程中,但我无法弄清楚我做错了什么。
非常感谢您的任何建议。
谢谢,
里克