我设置的 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/