ffmpeg capture decklink

简介: 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并不知道什么时候会第二次接入信号。


thxchtb3wcn3k_d11fc1ff3db9431d8ad7575e9297ae48.png

相关文章
|
4月前
|
编解码 算法 C++
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
【ffmpeg 基础函数】详解FFmpeg中的av_packet_ref函数
55 0
|
JavaScript
audio用法
之前老早之前写的 但不是markdown格式,总觉得不爽 这个记录下吧 都比较简单直接上代码吧
210 0
|
Android开发 存储 文件存储
31.FFmpeg+OpenGLES+OpenSLES播放器实现(五.FFmpeg解封装)
项目源码FFmpeg开发文档 Android Studio的开发环境已经准备好,接下来开始正式的写ndk代码,首先创建一个FFmpeg工具类,添加native方法 import android.
1398 0
|
编解码 并行计算 Linux
29.FFmpeg+OpenGLES+OpenSLES播放器实现(三.FFmpeg配置和编译脚本)
项目源码FFmpeg开发文档 编译过程中涉及到很多ndk中的so库和头文件以及交叉编译的工具,在命令执行的时候会在ndk相应的目录下去查找,所以我们可以使用export命令事先将这些路径设置到环境变量,使用的时候可以很方便的找到 //NDK加入环境变量.
2142 0
|
JavaScript 前端开发
|
JavaScript 前端开发