2016-11-02 3 views
0

.mp4ファイルには関連する.ttmlキャプションファイルが付属しています。私たちはWowzaを使用して、ストリームを中断せずに動的スケジュールに基づいてこれらのファイルを動的にロードしてストリーミングします。wowza java apiはキャプションを挿入します

こちらのチュートリアル(https://www.wowza.com/docs/how-to-use-ipublishingprovider-api-to-publish-server-side-live-streams)に従うと、指定した時刻に個々のmp4ファイルをストリーミングすることができました。

ただし、関連するキャプションファイルを挿入するJava APIコマンドが見つかりませんでした。私はこのページ(https://www.wowza.com/docs/how-to-configure-closed-captioning-for-live-streaming)を見つけました。これは、Java APIについてではなく、設定の設定について説明しています。ページの最後には、API呼び出しのサンプルを示すサンプルパッケージがありましたが、そのセクションは「レガシー」として記述されていました。私はそれを拡張することができますが、それは "遺産"なので、モジュールが依存するAPIは、WMSのそれ以降のバージョンでは利用できなくなる恐れがあります。

PublishingProviderMediaReader呼び出しの直後に、システムにttmlファイルを読み込むように(または手動でテキストを挿入するように)、低レベルの方法(「従来の方法」の横)がありますか?どのような援助又は入力がはるかに高く評価されている

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; 
    } 

} 

:以下

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"); 
    } 
} 

上記コードを呼び出す基地リスナー上記のリンクから貼り付けられたコードです。前もって感謝します。

答えて

1

次を使用してストリームからキューポイントやメタデータを挿入することができます

package com.wowza.example.module; 

import com.wowza.wms.amf.*; 
import com.wowza.wms.client.*; 
import com.wowza.wms.module.*; 
import com.wowza.wms.request.*; 
import com.wowza.wms.stream.*; 

public class ModuleInjectData extends ModuleBase { 

    public void setCaption (IClient client, RequestFunction function, AMFDataList params) 
    { 
     String streamname = params.getString(PARAM1); 
     String text = params.getString(PARAM2); 
     String language = params.getString(PARAM3); 
     String trackid = params.getString(PARAM4); 

     IMediaStream stream = client.getAppInstance().getStreams().getStream(streamname); 

     //essential code 
     AMFDataMixedArray data = new AMFDataMixedArray(); 
     data.put("text", new AMFDataItem(text)); 
     data.put("language", new AMFDataItem(language)); 
     data.put("trackid", new AMFDataItem(trackid)); 
     stream.sendDirect("onTextData", data); 
     ((MediaStream)stream).processSendDirectMessages(); 
     getLogger().info("Caption: " + text); 
    } 

    public void injectMetaData(IClient client, RequestFunction function, AMFDataList params) 
    { 
     String streamName = params.getString(PARAM1); 
     String data = params.getString(PARAM2); 
     IMediaStream stream = client.getAppInstance().getStreams().getStream(streamName); 
     if (stream != null) 
     { 
      AMFDataList amfList = new AMFDataList(); 

      amfList.add(new AMFDataItem("@setDataFrame")); 
      amfList.add(new AMFDataItem("onMetaData")); 

      AMFDataMixedArray metaData = new AMFDataMixedArray(); 

      metaData.put("param1", data); 
      metaData.put("param2", new AMFDataItem("data2")); 

      amfList.add(metaData); 

      synchronized(stream) 
      { 
       byte[] dataData = amfList.serialize(); 
       int size = dataData.length; 
       long timecode = Math.max(stream.getAudioTC(), stream.getVideoTC()); 
       stream.setDataTC(timecode); 
       stream.setDataSize(size); 
       stream.startDataPacket(); 
       stream.addDataData(dataData, 0, size); 
      } 
     } 
    } 
} 

あなたはあなたのファイルを読み込み、上記の方法を使用してデータを注入することをBufferedReaderオブジェクトを作成する必要があります。

+0

ありがとうございます。文字通り、setCaption関数がドロップされ、rtmp – nanytech

関連する問題