我设置了这样的DVB参数:
null
那么我试图在FFmpeg中使用这个设置的DVB,但它会出错。为什么FFmpeg没有看到Frontend0?
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
};
答案 0 :(得分:0)
你的来源是错误的和不完整的;你填写了一个struct dtv_property数组,但它根本没有通过ioctl发送到前端。
Step1:缺少这样的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根本没有arg,并且是序列中的最后一项。另外:DTV_BANDWIDTH_HZ是以Hz为单位,而不是MHz。
步骤2:当前端仍保持打开状态(!)时,打开解复用设备,即。 "的/ dev / DVB / adapter0 / demux0"或" / dev / dvb / adapter0 / dvr0"并在该设备上设置PID过滤器。在选择任一设备之前,请阅读有关差异的文档。
Step3:不要尝试从dvb前端读取。在前端仍然打开时从demux读取。前端仅用于接收调谐命令或回复信号统计,但是从解复用器接收MPEG TS数据。一旦前端关闭,您就无法再从demux中读取任何内容,因此请保持打开状态。因此 3.1打开demux 3.2使用DMX_SET_FILTER ioctl或DMX_SET_PES_FILTER ioctl来定义您想要接收的数据(PID)。 3.3从demux设备读取并发送到ffmpeg
所有这些都有详细记录,可能你应该阅读文档。