c - FFmpeg 看不到设置的 frontend0 参数

标签 c ffmpeg centos

我设置的 DVB 参数如下:

static struct dtv_property props[] = {
{ .cmd = DTV_DELIVERY_SYSTEM, .u.data = SYS_DVBT2 },
{ .cmd = DTV_FREQUENCY,       .u.data = 474000000 },
{ .cmd = DTV_MODULATION,      .u.data = QAM_64 },
{ .cmd = DTV_INVERSION,       .u.data = INVERSION_AUTO },
{ .cmd = DTV_INNER_FEC,       .u.data = FEC_AUTO },
{ .cmd = DTV_TUNE ,           .u.data = FE_SET_FRONTEND},
{ .cmd = DTV_BANDWIDTH_HZ ,   .u.data = 8 },
};

static struct dtv_properties dtv_prop = {
.num = 7, .props = props
};

然后我尝试在 FFmpeg 中使用此设置的 DVB 使用,但出现错误。为什么 FFmpeg 看不到 Frontend0?

if(avformat_open_input(&pFormatCtx, "/dev/dvb/adapter0/frontend0", NULL, NULL)!=0)
{
    printf("error");
    return -1;
}

最佳答案

您的来源错误且不完整;你填写了一个 struct dtv_property 数组,但它根本无法通过 ioctl 发送到前端。

第 1 步:缺少类似这样的 ioctl() (fd 是前端设备上之前调用 open() 返回的 int)来进行实际调整:

    if ((ioctl(fd, FE_SET_PROPERTY, &dtv_prop)) != 0) {
        perror("FE_SET_PROPERTY failed");
        // do something on error here..
        }

并修复数组值,带宽需要在 DTV_TUNE 之前设置,DTV_TUNE 根本没有参数,并且是序列中的最后一项。另外:DTV_BANDWIDTH_HZ 的单位是 Hz,而不是 MHz。

第二步:当前端仍然保持打开状态(!)时,打开解复用设备,即。 “/dev/dvb/adapter0/demux0”或“/dev/dvb/adapter0/dvr0”并在该设备上设置 PID 过滤器。在选择任一设备之前,请阅读有关差异的文档。

第三步:不要尝试从 DVB 前端读取。在前端仍然打开的情况下从 demux 中读取。前端仅用于接收调谐命令或回复信号统计数据,但 MPEG TS 数据是从解复用器接收的。一旦前端关闭,您就无法再从 demux 读取任何内容,因此请保持其打开状态。所以 3.1 开放解复用器 3.2 使用 DMX_SET_FILTER ioctl 或 DMX_SET_PES_FILTER ioctl 定义要接收的数据(PID)。 3.3 从demux设备读取并发送给ffmpeg

所有这些都有详细记录,也许您应该阅读文档。

关于c - FFmpeg 看不到设置的 frontend0 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46824840/

相关文章:

nginx - CentOS 5 安装NGINX "No package found"错误

centos - firewall-cmd centos 端口转发似乎不起作用?

c - 关于 C 指针范围

html - 如何使用 libMongoose/Embedded Mongoose 发送 HTML 和图像?

FFmpeg 进行不必要的复用

audio - 如何从音频中删除一个部分并使用 ffmpeg 保留其余部分

Docker 'overlay' 占用的空间太大 - 如何调试?

c - 当此程序在 Windows 上运行时,为什么会出现回车符?

范围可以用括号括起来并在 C 中返回一个值吗?

Python - 按照序列在txt上插入行而不覆盖