蚂蚁媒体-React-Native-iOS / Android支持

时间:2020-06-24 17:58:20

标签: react-native webrtc ant-media-server

我尝试使用WebRTC React Native软件包设置Ant Media。不幸的是,花了一天后,我无法使其正常工作。

我最终从Ant Media iOS库构建了一个到React-Native的接口。效果很好。但是,我不是Java开发人员,需要支持Android。有没有人使用React-native-webrtc或其他任何有用的示例来帮助我使Android正常工作?

谢谢!

1 个答案:

答案 0 :(得分:2)

我正在使用 react-native-webrtc 将 webrtc-adaptor 移植到 RN,您可以在此处找到我正在开发的包 https://www.npmjs.com/package/rn-antmedia,我正在应用程序上使用它运行良好。

你可以通过npm或yarn安装,yarn add rn-antmedia,这个lib使用react-native-webrtc,那么你也需要安装这个lib并进行一些配置。

目前这个库正在开发中,一些蚂蚁媒体功能无法正常工作。我正在创建一个示例应用程序,在某些情况下该库可以工作。

这是一个如何使用lib的例子

import React, { useState, useRef, useCallback } from 'react';
import {SafeAreaView, Button} from 'react-native';
import {RTCView} from 'react-native-webrtc';
/* importing lib */
import { useAntMedia } from 'rn-antmedia';

const App = () => {
    const [localStream, setLocalStream] = useState('');
    const [remoteStream, setRemoteStream] = useState(null);
    const stream = useRef({id: ''}).current;
    
    const adaptor = useAntMedia({
    url: 'wss://testserver.com/WebRTCAppEE/websocket',
    mediaConstraints: {
      video: true,
      audio: true,
    },
    sdp_constraints: {
      offerToReceiveAudio: true,
      offerToReceiveVideo: true,
    },
        bandwidth: 300,
    callback(command, data) {
      switch (command) {
        case 'pong':
          break;
        case 'joinedTheRoom':
          if ('onJoinedRoom' in events) {
            const tok = data.ATTR_ROOM_NAME;
            this.initPeerConnection(data.streamId);
            this.publish(data.streamId, tok);

            const streams = data.streams;

            if (streams != null) {
              streams.forEach((item) => {
                if (item === stream.id) return;
                this.play(item, tok, roomId);
              });
            }
          }
          break;
        case 'streamJoined':
          if ('onStreamJoined' in events) {
            this.play(data.streamId, token, roomId);
          }
          break;
        default:
          break;
      }
    },
    callbackError: (err, data) => {
      console.error('callbackError', err, data);
    },
    });

    const handleConnect = useCallback(() => {
        if (adaptor) {
            const streamId = `12ans1`;
            const roomId = '5abcd1';

            stream.id = streamId;

            adaptor.joinRoom(roomId, streamId);
        };
    }, [adaptor]);

    useEffect(() => {
    if (adaptor) {
      const verify = () => {
        if (
          adaptor.localStream.current &&
          adaptor.localStream.current.toURL()
        ) {
          return setLocalStream(adaptor.localStream.current.toURL());
        }
        setTimeout(verify, 3000);
      };
      verify();
    }
    }, [adaptor]);
    
    useEffect(() => {
    if (adaptor && Object.keys(adaptor.remoteStreams).length > 0) {
      for (let i in adaptor.remoteStreams) {
        if (i !== stream.id) {
          let st =
            adaptor.remoteStreams[i][0] &&
            'toURL' in adaptor.remoteStreams[i][0]
              ? adaptor.remoteStreams[i][0].toURL()
              : null;
          setRemoteStream(st);
          break;
        } else {
          setRemoteStream(null);
        }
      }
    }
  }, [adaptor, stream.id]);

    
    return (
        <SafeAreaView style={{flex: 1;}}>
        {
            localStream && remoteStream ? (
                <>
                    <RTCView
                        style={{flex: 1}}
                        objectFit="cover"
                        streamURL={remoteStream}
                    />
                    <RTCView
                        style={{ width: 200, height: 200,  position: 'absolute', bottom: 0, right: 0, }}
                        objectFit="cover"
                        streamURL={localStream}
                    />
                </>
            ) : (
                <Button
                    onPress={handleConnect}
                    title="Join room"
                    color="#841584"
                    accessibilityLabel="Connect to antmedia"
                />
            )
        }
        </SafeAreaView>
    )
};