ffmpeg capture decklink

确保decklink设备已经接入

lspci | grep Blackm

02:00.0 Multimedia video controller: Blackmagic Design DeckLink SDI
Micro

确保decklink驱动已经正确安装

lsmod | grep blackmagic

blackmagic_io 2068480 2

确保ffmpeg已经启用decklink,如何配置之前的博文已经提到。

ffmpeg -devices

DE alsa ALSA audio output DE decklink Blackmagic
DeckLink output

查看decklink在ffmpeg中对应的设备名称

ffmpeg -sources

ffmpeg -sources

Auto-detected sources for decklink: 92:a08498c0:00000000 [DeckLink
SDI Micro] (none)

查看ffmpeg支持decklink的各种参数

ffmpeg -h demuxer=decklink

ffmpeg官网上有decklink的参数解释
http://ffmpeg.org/ffmpeg-all.html#decklink-1

以下是伪代码:

  AVDictionary *options = NULL;
    // av_dict_set(&options, "video_size", "640x480", 0);
    // av_dict_set(&options, "framerate", "30", 0);
    // av_dict_set(&options, "pixel_format", "yuyv422,", 0);
    // av_dict_set(&dict, "video_size", "1280*720", AV_DICT_MATCH_CASE);
    // av_dict_set(&dict, "framerate", "10", AV_DICT_MATCH_CASE);
    //以上参数如果不设置的话,就会用默认值,但默认值摄像头不一定支持
    int re = avformat_open_input(&ic, "92:a08498c0:00000000", ifmt, &options);
    if (re != 0)
    {
    
    
        printf("无法打开输入流\n");
        ErrorFunc(re);
    }
    re = avformat_find_stream_info(ic, NULL);
    int video_index = -1;
    for (int i = 0; i < ic->nb_streams; i++)
    {
    
    
        if (ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
        {
    
    
            // ic->streams[i]->codecpar
            video_index = i;
        }
    }
    printf("ic->streams[i]->codecpar-W:%d\n", ic->streams[video_index]->codecpar->width);
    printf("ic->streams[i]->codecpar-H:%d\n", ic->streams[video_index]->codecpar->height);
    printf("ic->streams[i]->codecpar-F:%d\n", ic->streams[video_index]->avg_frame_rate);

程序打印如下:

[decklink @ 0x559c264d8f00] Autodetected the input mode [decklink @
0x559c264d8f00] Found Decklink mode 1280 x 720 with rate 60.00
ic->streams[i]->codecpar-W:1280 ic->streams[i]->codecpar-H:720
ic->streams[i]->codecpar-F:60

ffmpeg当作测试用decklink可以,产品级还是很难。
有以下现象:
第一次接入信号前,用avformat_open_input打不开设备,接入信号后,可以打开,此时中途关闭,av_read_frame依然可以读到彩条和静音。此时接入拔出信号,ffmpeg都有日志提示,但我并没有找到对应的api能够检索到信号是否接入的反馈。
因此有以下问题:
1.不知道什么时候会接入第一次信号,因此需要不停avformat_open_input。
2.第一次接入信号拔掉后是彩条,但第二次接入的信号分辨率可能会变化,因此需要重新open,但ffmpeg并不知道什么时候会第二次接入信号。

ffmpeg是音视频必备,但即使从业数年,它似乎依然有无穷的秘密,感兴趣添加笔者微信:YQW1163720468,加入ffmpeg微信群讨论。但记得备注:ffmpeg爱好者

猜你喜欢

转载自blog.csdn.net/weixin_43466192/article/details/131230718