Многоадресная рассылка FFmpeg с несколькими сетевыми интерфейсами - PullRequest
0 голосов
/ 27 августа 2018

У меня есть java-приложение в качестве оболочки на FFmpeg. Мне нужно захватить многоадресный поток mp2, преобразовать его в mp3 и отправить преобразованный многоадресный поток на другой адрес. Это работает хорошо. Но теперь у меня есть два сетевых интерфейса. И один из них для интернета / локальной сети (eth1). Необходимо настроить второй сетевой интерфейс (eth2) для захвата и отправки многоадресных потоков.

Но по умолчанию ffmpeg пытается выполнить захват с первого сетевого интерфейса. Я вижу пакеты в tcpdump, но ffmpeg не захватывает их из eth2.

Как я могу указать интерфейс для захвата потока и интерфейс для отправки потока?

1 Ответ

0 голосов
/ 28 августа 2018

Это было решено утилитой smcroute.

application.properties:

smcroute.config.file                        = /etc/smcroute.conf

RoutingConfig.java:

public class RoutingConfig {

    private final File file;

    public RoutingConfig(String filename) {
        this.file = new File(filename);
    }

    public List<RoutingRecord> read() throws IOException {
        List<String> lines = Files.readAllLines(file.toPath());
        return lines.stream().map(RoutingRecord::new).collect(Collectors.toList());
    }

    public void write(List<RoutingRecord> records) throws IOException {
        List<String> lines = records.stream().map(RoutingRecord::toString).collect(Collectors.toList());
        Files.write(file.toPath(), lines);
    }
}

RoutingRecord.java:

public class RoutingRecord {

    private String sourceInterface;
    private String multicastAddress;
    private String sourceMulticastAddress;
    private List<String> destinationInterfaces;

    public RoutingRecord() {
    }

    public RoutingRecord(String line) {

        String[] words = line.split(" ");

        this.sourceInterface        = words[2];
        this.multicastAddress       = words[4];
        this.sourceMulticastAddress = words[6];
        this.destinationInterfaces  = new ArrayList<>(Arrays.asList(words).subList(8, words.length));
    }

    public RoutingRecord(String sourceInterface,
                     String multicastAddress,
                     String sourceMulticastAddress,
                     List<String> destinationInterfaces
    ) {
        this.sourceInterface        = sourceInterface;
        this.multicastAddress       = multicastAddress;
        this.sourceMulticastAddress = sourceMulticastAddress;
        this.destinationInterfaces  = destinationInterfaces;
    }

    public String getSourceInterface() {return sourceInterface;}

    public String getMulticastAddress() {return multicastAddress;}

    public String getSourceMulticastAddress() {return sourceMulticastAddress;}

    public List<String> getDestinationInterfaces() {return destinationInterfaces;}

    public String getDestinationInterfacesLine() {return String.join(", ", destinationInterfaces);}

    public RoutingRecord setSourceInterface(String sourceInterface) {
        this.sourceInterface = sourceInterface;
        return this;
    }

    public RoutingRecord setMulticastAddress(String multicastAddress) {
        this.multicastAddress = multicastAddress;
        return this;
    }

    public RoutingRecord setSourceMulticastAddress(String sourceMulticastAddress) {
        this.sourceMulticastAddress = sourceMulticastAddress;
        return this;
    }

    public RoutingRecord setDestinationInterfaces(List<String> destinationInterfaces) {
        this.destinationInterfaces = destinationInterfaces;
        return this;
    }

    @Override
    public String toString() {
        return "mroute from " + sourceInterface + " " +
                "group " + multicastAddress + " " +
                "source " + sourceMulticastAddress + " " +
                "to " + String.join(" ", destinationInterfaces);
    }

RoutingServiceImpl.java:

@Service
public class RoutingServiceImpl implements RoutingService {

    private final Environment environment;

    @Autowired
    public RoutingServiceImpl(Environment environment) {
        this.environment = environment;
    }

    @Override
    public List<RoutingRecord> getRoutingLines() throws IOException {
        String filename             = environment.getProperty("smcroute.config.file");
        RoutingConfig routingConfig = new RoutingConfig(filename);
        return routingConfig.read();
    }

    @Override
    public void saveRoutingLines(List<RoutingRecord> records) throws IOException {
        String filename = environment.getProperty("smcroute.config.file");
        RoutingConfig routingConfig = new RoutingConfig(filename);
        routingConfig.write(records);
    }

    @Override
    public void saveRoutingLine(RoutingRecord routingRecord) throws IOException {
        String filename = environment.getProperty("smcroute.config.file");
        RoutingConfig routingConfig = new RoutingConfig(filename);

        List<RoutingRecord> records = routingConfig.read();
        records.add(routingRecord);

        routingConfig.write(records);
    }

    @Override
    public void applyRoutes() throws IOException {

        Runtime rt = Runtime.getRuntime();

        rt.exec(new String[] {
                "service",
                "smcroute",
                "restart"
        });
    }
}
...