.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");
}
}
上記コードを呼び出す基地リスナー上記のリンクから貼り付けられたコードです。前もって感謝します。
ありがとうございます。文字通り、setCaption関数がドロップされ、rtmp – nanytech