package org.oneliveweb.live.streams; import java.nio.file.Files; import java.util.ArrayList; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.entermediadb.asset.MediaArchive; import org.entermediadb.video.CloudTranscodeManager; import org.ijsolutions.testbench.TestBench; import org.openedit.CatalogEnabled; import org.openedit.Data; import org.openedit.ModuleManager; import org.openedit.OpenEditException; import org.openedit.hittracker.HitTracker; import org.openedit.util.Exec; public class RtmpStreamer implements CatalogEnabled { protected ModuleManager fieldModuleManager; protected Exec fieldExec; LongRunningProcess fieldStreamProcess; protected String fieldCatalogId; private static final Log log = LogFactory.getLog(LiveStreamManager.class); protected String fieldStreamId; public String getStreamId() { return fieldStreamId; } public void setStreamId(String inStreamId) { fieldStreamId = inStreamId; } public boolean isRunning() { return getStreamProcess().isRunning(); } public String getCatalogId() { return fieldCatalogId; } public void setCatalogId(String inCatalogId) { fieldCatalogId = inCatalogId; } public void setStreamProcess(LongRunningProcess inNginxProcess) { fieldStreamProcess = inNginxProcess; } public MediaArchive getMediaArchive() { return (MediaArchive) getModuleManager().getBean(getCatalogId(), "mediaArchive"); } public TestBench getTestBench() { return (TestBench) getModuleManager().getBean(getCatalogId(), "testBench"); } public ModuleManager getModuleManager() { return fieldModuleManager; } public void setModuleManager(ModuleManager inModuleManager) { fieldModuleManager = inModuleManager; } public Exec getExec() { return fieldExec; } public void setExec(Exec fieldExec) { this.fieldExec = fieldExec; } public void startStream() { if (fieldStreamId == null) { throw new OpenEditException("Cannot start stream, no stream ID set"); } TestBench bench = getTestBench(); if (fieldStreamProcess != null) { getStreamProcess().forceDestroyProcess();// just for testing, delete this fieldStreamProcess = null; } if (fieldStreamProcess == null || !fieldStreamProcess.isRunning()) { fieldStreamProcess = new LongRunningProcess(); fieldStreamProcess.setExecutorManager(getExec().getExecutorManager()); try { ArrayList args = new ArrayList(); // exec ffmpeg -i rtmp://localhost/src/$name // -c:a copy -c:v libx264 -b:v 128K -f flv rtmp://localhost/hls/$name_low // -c:a copy -c:v libx264 -b:v 256k -f flv rtmp://localhost/hls/$name_mid // -c:a copy -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi; // args.add("-i"); args.add("rtmp://localhost:1936/src/" + getStreamId()); HitTracker streams = bench.query("simulcasts").exact("livestream", getStreamId()) .exact("streamenabled", true).search(); for (Iterator iterator = streams.iterator(); iterator.hasNext();) { Data stream = (Data) iterator.next(); addNextStream(stream, args); } fieldStreamProcess.start("ffmpeg", args); // fieldNginxProcess.start("/usr/sbin/nginx", args); } catch (Exception ex) { fieldStreamProcess = null; throw new OpenEditException(ex); } } if (!fieldStreamProcess.isRunning()) { log.info(fieldStreamProcess.getStreamcopy().getNextResult()); } } private void addNextStream(Data streamdetails, ArrayList args) { // args.add("-c:a"); // args.add("copy"); // args.add("-c:v"); // args.add("copy"); args.add("-f"); args.add("flv"); String key = streamdetails.get("key"); String url = streamdetails.get("url"); args.add(url + "/" + key); } public LongRunningProcess getStreamProcess() { return fieldStreamProcess; } public void stopNginx() { } public void endStream() { if (getStreamProcess() != null) { getStreamProcess().destroyProcess(); } } }