wowza java api injizieren Bildunterschriften

Wir haben eine Reihe von .mp4-Dateien zusammen mit den zugehörigen .ttml-Untertiteldateien geöffnet. Wir verwenden Wowza, um diese Dateien nach einem dynamischen Zeitplan dynamisch zu laden und zu streamen, ohne den Stream zu unterbrechen.

Ich konnte dem Tutorial hier folgen https: //www.wowza.com/docs/how-to-use-ipublishingprovider-api-to-publish-server-side-live-stream), um einzelne mp4-Dateien zu festgelegten Zeiten zu streamen.

Ich konnte jedoch keinen Java-API-Befehl zum Einfügen der zugehörigen Untertiteldateien finden. Ich habe diese Seite gefunden https: //www.wowza.com/docs/how-to-configure-closed-captioning-for-live-streamin), bei dem es nicht um die Java-API geht, sondern um eine Konfigurationseinstellung. Am Ende der Seite befand sich ein Beispielpaket mit einigen API-Aufrufen. Dieser Abschnitt wurde jedoch als "Legacy" bezeichnet. Ich könnte das erweitern, aber da es "Legacy" ist, befürchte ich, dass die API, von der das Modul abhängt, in späteren Versionen von WMS möglicherweise nicht verfügbar ist.

Gibt es eine einfache Möglichkeit (neben der "Legacy" -Methode), das System anzuweisen, unmittelbar nach einem PublishingProviderMediaReader-Aufruf eine ttml-Datei zu laden (oder nur Text manuell einzufügen)?

Below ist der Code, der über den obigen Link eingefügt wurde

package com.wowza.wms.plugin.test.integration;

import com.wowza.wms.stream.publish.*;
import com.wowza.wms.vhost.*;
import com.wowza.wms.logging.*;

public class ServerPublisherWorker extends Thread
{
    private long sleepTime = 75;
    private boolean running = true;
    private Object lock = new Object();

    private String applicationName = "live";
    private String vodStreamName = "mp4:sample.mp4";
    private String liveStreamName = "myStream";
    private String publishStreamName = "publishstream";
    private int cycleTime = 10000;

    public synchronized void quit()
    {
        synchronized(lock)
        {
            running = false;
        }
    }

    public void run()
    {
        WMSLoggerFactory.getLogger(ServerPublisherWorker.class).info("ServerPublisherWorker.run: START");

        long startTime = System.currentTimeMillis();
        long playStartTime = startTime;

        try
        {
            IVHost vhost = VHostSingleton.getInstance(VHost.VHOST_DEFAULT);
            Publisher publisher = Publisher.createInstance(vhost, applicationName);

            publisher.publish(publishStreamName);

            long nextSwitch = playStartTime + cycleTime;
            long nextType = 0;
            IPublishingProvider provider = new PublishingProviderMediaReader(publisher, playStartTime, vodStreamName);
            //provider.seek(20000);
            provider.setRealTimeStartTime(startTime);

            WMSLoggerFactory.getLogger(ServerPublisherWorker.class).info("ServerPublisherWorker.run: Start with vod stream: "+vodStreamName);

            while(true)
            {
                boolean moreInFile = provider!=null?provider.play(publisher):false;

                long currentTime = System.currentTimeMillis();
                if (!moreInFile || currentTime > nextSwitch)
                {
                    if (provider != null)
                        provider.close();
                    provider = null;

                    if ((nextType % 2) == 0)
                    {
                        provider = new PublishingProviderLive(publisher, publisher.getMaxTimecode(), liveStreamName);
                        //((PublishingProviderLive)provider).setStartOnPreviousKeyFrame(false);
                        provider.setRealTimeStartTime(currentTime);

                        WMSLoggerFactory.getLogger(ServerPublisherWorker.class).info("ServerPublisherWorker.run: Switch to live stream: "+liveStreamName);
                    }
                    else
                    {
                        provider = new PublishingProviderMediaReader(publisher, publisher.getMaxTimecode(), vodStreamName);
                        //provider.seek(20000);
                        provider.setRealTimeStartTime(currentTime);

                        WMSLoggerFactory.getLogger(ServerPublisherWorker.class).info("ServerPublisherWorker.run: Switch to vod stream: "+vodStreamName);
                    }

                    nextSwitch = currentTime + cycleTime;
                    nextType++;

                    if (nextType == 100)
                        break;
                }
                else
                    sleep(sleepTime);

                synchronized(lock)
                {
                    if (!running)
                        break;
                }
            }

            provider.close();

            publisher.publish(null);

            synchronized(lock)
            {
                running = false;
            }
        }
        catch (Exception e)
        {
            WMSLoggerFactory.getLogger(ServerPublisherWorker.class).error("ServerPublisherWorker.run: "+e.toString());
            e.printStackTrace();
        }

        WMSLoggerFactory.getLogger(ServerPublisherWorker.class).info("ServerPublisherWorker.run: STOP");
    }
}

Und der Basis-Listener, der den obigen Code aufruft:

package com.wowza.wms.plugin.test.integration;

import com.wowza.wms.server.*;

public class ServerPublisherServerListener implements IServerNotify
{
    ServerPublisherWorker worker = null;

    public void onServerCreate(IServer server)
    {
    }

    public void onServerInit(IServer server)
    {
        worker = new ServerPublisherWorker();
        worker.start();
    }

    public void onServerShutdownComplete(IServer server)
    {
    }

    public void onServerShutdownStart(IServer server)
    {
        if (worker != null)
            worker.quit();
        worker = null;
    }

}

Jede Hilfe oder Eingabe wird sehr geschätzt. Danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage