AirenSoft / OvenMediaEngine

OvenMediaEngine (OME) is a Sub-Second Latency Live Streaming Server with Large-Scale and High-Definition. #WebRTC #LLHLS
https://airensoft.com/ome.html
GNU Affero General Public License v3.0
2.61k stars 1.06k forks source link

Docker Launcher cannot start when enabling API Manager in Server.xml #1306

Closed Bjorn-Slettemark closed 1 year ago

Bjorn-Slettemark commented 1 year ago

Describe the bug When using the docker launcher with the 0.15.13 build, the launcher cannot start a docker container when Server.xml enables API manager.

To Reproduce

  1. Server.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <Server version="8">
    <Name>OvenMediaEngine</Name>
    <!-- Host type (origin/edge) -->
    <Type>origin</Type>
    <!-- Specify IP address to bind ("*" means all IPv4 IPs, "::" means all IPv6 IPs) -->
    <!-- Uncomment the line below to enable IPv6 -->
    <!-- <IP>::</IP> -->
    <IP>*</IP>
    <PrivacyProtection>false</PrivacyProtection>
    
    <!-- 
    To get the public IP address(mapped address of stun) of the local server. 
    This is useful when OME cannot obtain a public IP from an interface, such as AWS or docker environment. 
    If this is successful, you can use ${PublicIP} in your settings.
    -->
    <StunServer>stun.ovenmediaengine.com:13478</StunServer>
    
    <Modules>
        <!-- 
        Currently OME only supports h2 like all browsers do. Therefore, HTTP/2 only works on TLS ports.         
        -->
        <HTTP2>
            <Enable>true</Enable>
        </HTTP2>
    
        <LLHLS>
            <Enable>true</Enable>
        </LLHLS>
    
        <!-- P2P works only in WebRTC and is experiment feature -->
        <P2P>
            <!-- disabled by default -->
            <Enable>false</Enable>
            <MaxClientPeersPerHostPeer>2</MaxClientPeersPerHostPeer>
        </P2P>
    </Modules>
    
    <!-- Settings for the ports to bind -->
    <Bind>
        <Managers>
            <API>
                <Port>8081</Port>
                <TLSPort>8082</TLSPort>
                <WorkerCount>1</WorkerCount>
            </API>
        </Managers>
    
        <Providers>
            <!-- Pull providers -->
            <RTSPC>
                <WorkerCount>1</WorkerCount>
            </RTSPC>
            <OVT>
                <WorkerCount>1</WorkerCount>
            </OVT>
            <!-- Push providers -->
            <RTMP>
                <Port>1935</Port>
                <WorkerCount>1</WorkerCount>
            </RTMP>
            <SRT>
                <Port>9999</Port>
                <WorkerCount>1</WorkerCount>
            </SRT>
            <MPEGTS>
                <!--
                    Below is an example of listening on port 4000-4005 (<Port>4000-4004,4005/udp</Port>)
                    This is just a demonstration to show that you can configure the port in several ways
    
                    <Port>4000-4004,4005/udp</Port>
                -->
                <Port>4000/udp</Port>
            </MPEGTS>
            <WebRTC>
                <Signalling>
                    <Port>3333</Port>
                    <TLSPort>3334</TLSPort>
                    <WorkerCount>1</WorkerCount>
                </Signalling>
    
                <IceCandidates>
                    <!-- Uncomment the line below to use IPv6 ICE Candidate -->
                    <!-- <IceCandidate>[::]:10000-10004/udp</IceCandidate> -->
                    <IceCandidate>*:10000-10004/udp</IceCandidate>
    
                    <!-- Uncomment the line below to use a link local address when specifying an address with IPv6 wildcard (::) -->
                    <!-- <EnableLinkLocalAddress>true</EnableLinkLocalAddress> -->
    
                    <!-- 
                        If you want to stream WebRTC over TCP, specify IP:Port for TURN server.
                        This uses the TURN protocol, which delivers the stream from the built-in TURN server to the player's TURN client over TCP. 
                    -->
                    <TcpRelay>*:3478</TcpRelay>
                    <!-- TcpForce is an option to force the use of TCP rather than UDP in WebRTC streaming. (You can omit ?transport=tcp accordingly.) If <TcpRelay> is not set, playback may fail. -->
                    <TcpForce>true</TcpForce>
                    <TcpRelayWorkerCount>1</TcpRelayWorkerCount>
                </IceCandidates>
            </WebRTC>
        </Providers>
    
        <Publishers>
            <OVT>
                <Port>9000</Port>
                <WorkerCount>1</WorkerCount>
            </OVT>
            <LLHLS>
                <!-- 
                OME only supports h2, so LLHLS works over HTTP/1.1 on non-TLS ports. 
                LLHLS works with higher performance over HTTP/2, 
                so it is recommended to use a TLS port.
                -->
                <Port>3333</Port>
                <!-- If you want to use TLS, specify the TLS port -->
                <TLSPort>3334</TLSPort>
                <WorkerCount>1</WorkerCount>
            </LLHLS>
            <WebRTC>
                <Signalling>
                    <Port>3333</Port>
                    <TLSPort>3334</TLSPort>
                    <WorkerCount>1</WorkerCount>
                </Signalling>
                <IceCandidates>
                    <!-- Uncomment the line below to use IPv6 ICE Candidate -->
                    <!-- <IceCandidate>[::]:10000-10004/udp</IceCandidate> -->
                    <IceCandidate>*:10000-10004/udp</IceCandidate>
    
                    <!-- Uncomment the line below to use a link local address when specifying an address with IPv6 wildcard (::) -->
                    <!-- <EnableLinkLocalAddress>true</EnableLinkLocalAddress> -->
    
                    <!-- 
                        If you want to stream WebRTC over TCP, specify IP:Port for TURN server.
                        This uses the TURN protocol, which delivers the stream from the built-in TURN server to the player's TURN client over TCP. 
                    -->
                    <TcpRelay>*:3478</TcpRelay>
                    <!-- TcpForce is an option to force the use of TCP rather than UDP in WebRTC streaming. (You can omit ?transport=tcp accordingly.) If <TcpRelay> is not set, playback may fail. -->
                    <TcpForce>true</TcpForce>
                    <TcpRelayWorkerCount>1</TcpRelayWorkerCount>
                </IceCandidates>
            </WebRTC>
        </Publishers>
    </Bind>
                <Managers>
                <Host>
                        <Names>
                                <Name>*</Name>
                        </Names>
                </Host>
                <API>
                        <AccessToken>your_access_token</AccessToken>
                </API>
        </Managers>
    
    <!--
        Refer https://airensoft.gitbook.io/ovenmediaengine/alert
    <Alert>
        <Url></Url>
        <SecretKey></SecretKey>
        <Timeout>3000</Timeout>
        <Rules>
            <Ingress>
                <MinBitrate></MinBitrate>
                <MaxBitrate></MaxBitrate>
                <MinFramerate></MinFramerate>
                <MaxFramerate></MaxFramerate>
                <MinWidth></MinWidth>
                <MinHeight></MinHeight>
                <MaxWidth></MaxWidth>
                <MaxHeight></MaxHeight>
                <MinSamplerate></MinSamplerate>
                <MaxSamplerate></MaxSamplerate>
                <LongKeyFrameInterval />
                <HasBFrames />
            </Ingress>
        </Rules>
    </Alert>
    -->
    
    <VirtualHosts>
        <!-- You can use wildcard like this to include multiple XMLs -->
        <VirtualHost include="VHost*.xml" />
        <VirtualHost>
            <Name>default</Name>
            <!--Distribution is a value that can be used when grouping the same vhost distributed across multiple servers. This value is output to the events log, so you can use it to aggregate statistics. -->
            <Distribution>ovenmediaengine.com</Distribution>
    
            <!-- Settings for multi ip/domain and TLS -->
            <Host>
                <Names>
                    <!-- Host names
                        <Name>stream1.airensoft.com</Name>
                        <Name>stream2.airensoft.com</Name>
                        <Name>*.sub.airensoft.com</Name>
                        <Name>192.168.0.1</Name>
                    -->
                    <Name>*</Name>
                </Names>
                <!--
                <TLS>
                    <CertPath>path/to/file.crt</CertPath>
                    <KeyPath>path/to/file.key</KeyPath>
                    <ChainCertPath>path/to/file.crt</ChainCertPath>
                </TLS>
                -->
            </Host>
    
            <!--    
            Refer https://airensoft.gitbook.io/ovenmediaengine/signedpolicy
            <SignedPolicy>
                <PolicyQueryKeyName>policy</PolicyQueryKeyName>
                <SignatureQueryKeyName>signature</SignatureQueryKeyName>
                <SecretKey>aKq#1kj</SecretKey>
    
                <Enables>
                    <Providers>rtmp,webrtc,srt</Providers>
                    <Publishers>webrtc,hls,llhls,dash,lldash</Publishers>
                </Enables>
            </SignedPolicy>
            -->
    
            <!--
            <AdmissionWebhooks>
                <ControlServerUrl></ControlServerUrl>
                <SecretKey></SecretKey>
                <Timeout>3000</Timeout>
                <Enables>
                    <Providers>rtmp,webrtc,srt</Providers>
                    <Publishers>webrtc,hls,llhls,dash,lldash</Publishers>
                </Enables>
            </AdmissionWebhooks>
            -->
    
            <!-- <Origins>
                <Properties>
                    <NoInputFailoverTimeout>3000</NoInputFailoverTimeout>
                    <UnusedStreamDeletionTimeout>60000</UnusedStreamDeletionTimeout>
                </Properties>
                <Origin>
                    <Location>/app/stream</Location>
                    <Pass>
                        <Scheme>ovt</Scheme>
                        <Urls><Url>origin.com:9000/app/stream_720p</Url></Urls>
                    </Pass>
                    <ForwardQueryParams>false</ForwardQueryParams>
                </Origin>
                <Origin>
                    <Location>/app/</Location>
                    <Pass>
                        <Scheme>ovt</Scheme>
                        <Urls><Url>origin.com:9000/app/</Url></Urls>
                    </Pass>
                </Origin>
                <Origin>
                    <Location>/edge/</Location>
                    <Pass>
                        <Scheme>ovt</Scheme>
                        <Urls><Url>origin.com:9000/app/</Url></Urls>
                    </Pass>
                </Origin>
            </Origins> -->
    
            <!--
            <OriginMapStore>
                In order to use OriginMap, you must enable OVT Publisher in Origin and OVT Provider in Edge.
                <RedisServer>
                    <Host>192.168.0.160:6379</Host>
                    <Auth>!@#ovenmediaengine</Auth>
                </RedisServer>
    
                This is only needed for the origin server and used to register the ovt address of the stream. 
                <OriginHostName>ome-dev.airensoft.com</OriginHostName>
            </OriginMapStore>
            -->
    
            <!-- Default CORS Settings -->
            <CrossDomains>
                <Url>*</Url>
            </CrossDomains>
    
            <!-- Settings for applications -->
            <Applications>
                <Application>
                    <Name>app</Name>
                    <!-- Application type (live/vod) -->
                    <Type>live</Type>
                    <OutputProfiles>
                        <!-- Enable this configuration if you want to hardware acceleration using GPU -->
                        <HardwareAcceleration>false</HardwareAcceleration>
                        <OutputProfile>
                            <Name>bypass_stream</Name>
                            <OutputStreamName>${OriginStreamName}</OutputStreamName>
    
                            <!-- 
                            You can provide ABR with Playlist. Currently, ABR is supported in LLHLS and WebRTC.
    
                            <Playlist>
                                <Name>Paid</Name>
                                You can play this playlist with 
                                LLHLS : http[s]://<domain>[:port]/<app>/<stream>/<FileName>.m3u8 
                                WebRTC : ws[s]://<domain>[:port]/<app>/<stream>/<FileName>
                                Note that the keywords "playlist" and "chunklist" MUST NOT be included in FileName.
                                <FileName>premium</FileName>
    
                                Options is optional. 
                                <Options>
                                    WebRtcAutoAbr : Default value is true
                                    <WebRtcAutoAbr>true</WebRtcAutoAbr> 
                                </Options>
    
                                <Rendition>
                                    <Name>bypass</Name>
                                    <Video>bypass_video</Video>
                                    <Audio>bypass_audio</Audio>
                                </Rendition>
                                <Rendition>
                                    <Name>480p</Name>
                                    <Video>480p</Video>
                                    <Audio>bypass_audio</Audio>
                                </Rendition>
                                <Rendition>
                                    <Name>720p</Name>
                                    <Video>720p</Video>
                                    <Audio>bypass_audio</Audio>
                                </Rendition>
                            </Playlist>
                            <Playlist>
                                <Name>free</Name>
                                <FileName>free</FileName>
                                <Rendition>
                                    <Name>720p</Name>
                                    <Video>720p</Video>
                                    <Audio>bypass_audio</Audio>
                                </Rendition>
                            </Playlist>
                            -->
    
                            <Encodes>
                                <Video>
                                    <Name>bypass_video</Name>
                                    <Bypass>true</Bypass>
                                </Video>
                                <Audio>
                                    <Name>aac_audio</Name>
                                    <Codec>aac</Codec>
                                    <Bitrate>128000</Bitrate>
                                    <Samplerate>48000</Samplerate>
                                    <Channel>2</Channel>
                                    <BypassIfMatch>
                                        <Codec>eq</Codec>
                                    </BypassIfMatch>
                                </Audio>
                                <Audio>
                                    <Name>opus_audio</Name>
                                    <Codec>opus</Codec>
                                    <Bitrate>128000</Bitrate>
                                    <Samplerate>48000</Samplerate>
                                    <Channel>2</Channel>
                                    <BypassIfMatch>
                                        <Codec>eq</Codec>
                                    </BypassIfMatch>
                                </Audio>
                                <!--
                                <Video>
                                    <Name>video_1280</Name>
                                    <Codec>h264</Codec>
                                    <Bitrate>5024000</Bitrate>
                                    <Width>1920</Width>
                                    <Height>1280</Height>
                                    <Framerate>30</Framerate>
                                    <KeyFrameInterval>30</KeyFrameInterval>
                                    <BFrames>0</BFrames>
                                    <Preset>faster</Preset>
                                </Video>
                                <Video>
                                    <Name>video_720</Name>
                                    <Codec>h264</Codec>
                                    <Bitrate>2024000</Bitrate>
                                    <Width>1280</Width>
                                    <Height>720</Height>
                                    <Framerate>30</Framerate>
                                    <KeyFrameInterval>30</KeyFrameInterval>
                                    <BFrames>0</BFrames>                                    
                                    <Preset>faster</Preset>
                                </Video>    
                                <Audio>
                                    <Name>bypass_audio</Name>
                                    <Bypass>true</Bypass>
                                </Audio>                                                                
                                -->
                                <!-- 
                                     If all conditions of BypassIfMatch are matched, bypass is used without encoding.
                                     [Options] 
                                       eq: euqal to
                                       lte: less than or equal to
                                       gte: greater than or equal to
    
                                <Video>
                                    <Name>conditional_video_encoding</Name>
                                    <Codec>h264</Codec>
                                    <Bitrate>2024000</Bitrate>
                                    <Width>1280</Width>
                                    <Height>720</Height>
                                    <Framerate>30</Framerate>
                                    <BypassIfMatch>
                                        <Codec>eq</Codec>
                                        <Framerate>lte</Framerate>
                                        <Width>lte</Width>
                                        <Height>lte</Height>
                                        <SAR>eq</SAR>
                                    </BypassIfMatch>                                    
                                </Video>
                                <Audio>
                                    <Name>conditional_audio_encoding</Name>
                                    <Codec>aac</Codec>
                                    <Bitrate>128000</Bitrate>
                                    <Samplerate>48000</Samplerate>
                                    <Channel>2</Channel>
                                    <BypassIfMatch>
                                        <Codec>eq</Codec>
                                        <Samplerate>lte</Samplerate>
                                        <Channel>eq</Channel>
                                    </BypassIfMatch>
                                </Audio>                                                                            
                                -->
                            </Encodes>
                        </OutputProfile>
                    </OutputProfiles>
                    <Providers>
                        <OVT />
                        <WebRTC />
                        <RTMP />
                        <SRT />
                        <MPEGTS>
                            <StreamMap>
                                <!--
                                    Set the stream name of the client connected to the port to "stream_${Port}"
                                    For example, if a client connects to port 4000, OME creates a "stream_4000" stream
                                    <Stream>
                                        <Name>stream_${Port}</Name>
                                        <Port>4000,4001-4004</Port>
                                    </Stream>
                                    <Stream>
                                        <Name>stream_4005</Name>
                                        <Port>4005</Port>
                                    </Stream>
                                -->
                                <Stream>
                                    <Name>stream_${Port}</Name>
                                    <Port>4000</Port>
                                </Stream>
                            </StreamMap>
                        </MPEGTS>
                        <RTSPPull />
                        <WebRTC>
                            <Timeout>30000</Timeout>
                            <CrossDomains>
                                <Url>*</Url>
                            </CrossDomains>
                        </WebRTC>
                    </Providers>
                    <Publishers>
                        <AppWorkerCount>1</AppWorkerCount>
                        <StreamWorkerCount>8</StreamWorkerCount>
                        <OVT />
                        <WebRTC>
                            <Timeout>30000</Timeout>
                            <Rtx>false</Rtx>
                            <Ulpfec>false</Ulpfec>
                            <JitterBuffer>false</JitterBuffer>
                        </WebRTC>
                        <LLHLS>
                            <ChunkDuration>0.5</ChunkDuration>
                            <!-- <PartHoldBack> SHOULD be at least three times the <ChunkDuration> -->
                            <PartHoldBack>1.5</PartHoldBack>
                            <SegmentDuration>6</SegmentDuration>
                            <SegmentCount>10</SegmentCount>
                            <DVR>
                                <Enable>false</Enable>
                                <TempStoragePath>/tmp/ome_dvr/</TempStoragePath>
                                <MaxDuration>3600</MaxDuration>
                            </DVR>
                                                        <RTMPPush>
                                                        </RTMPPush>
                            <CrossDomains>
                                <Url>*</Url>
                            </CrossDomains>
                        </LLHLS>
                    </Publishers>
                </Application>
            </Applications>
        </VirtualHost>
    </VirtualHosts>
    </Server> 
  2. Use ./ome_docker_launcher.sh start.
  3. The Launcher throws an error.

Expected behavior A clear and concise description of what you expected to happen.

Logs • Starting OvenMediaEngine... • Obtaining the port list from /usr/share/ovenmediaengine/conf/Server.xml • ERROR: Not supported type: • This may be a bug of this launcher, and should not be occurred. • Please report this issue to https://github.com/AirenSoft/OvenMediaEngine/issues

Server (please complete the following information):

Player (please complete the following information):

Additional context It was frustrating as a newcomer to OverMediaEngine to battle this problem when it was much easier to just default back to docker in ubuntu.

dimiden commented 1 year ago

@MechaEngineer Thank you for the reporting. I have just fixed this issue and pushed it, so please try again with the script on the master branch! https://github.com/AirenSoft/OvenMediaEngine/commit/f85872745fcc795732a5aecbd64842a0569053bd

Bjorn-Slettemark commented 1 year ago

Yes - This seems to be working now. Thank you! :)