RemoteMonster Documents
HomepageBlogCommunityAbout Us
v2.x
v2.x
  • RemoteMonster
  • Overview
    • Flow
    • Structure
    • Examples
    • Features
    • Spec
  • Web
    • Web - Overview
    • Web - Getting Started
    • Web - Media
    • Web - Debug Inside
    • Web - Github
    • Web - SDK Reference
  • Android
    • Android - Overview
    • Android - Getting Started
    • Android - Media
    • Android - ProGuard
    • Android - Github
    • Android - SDK Reference
  • iOS
    • iOS - Overview
    • iOS - Getting Started
    • iOS - Media
    • iOS - Github
    • iOS - SDK Reference
  • api
    • Webhook API - Livecast - beta
    • Managing Channels
  • Common
    • Service Key
    • Config/RemonConfig
    • Livecast
    • Communication
    • Callbacks
    • Channel
    • Channel ID 규칙
    • Network Environment
    • Studio Environment
    • Media
    • Simulcast
    • Record - beta
    • Error
    • About WebRTC
    • FAQ
  • 그룹통화
    • 그룹통화 만들기(Android)
    • 그룹통화 만들기(iOS)
    • 그룹통화 만들기(Web)
  • 튜토리얼 - 통화
    • 통화 5 분 안에 시작하기
    • 통화 키 발급
    • 새 통화 프로젝트 설정 - Web
    • 단순 통화 앱 만들기 - Web
  • 튜토리얼 - 방송
    • 방송 5 분 안에 시작하기
    • 방송 키 발급
    • 새 방송 프로젝트 설정 - Web
    • 단순 시청 앱 만들기 - Web
Powered by GitBook
On this page
  • Overview
  • View
  • Basic
  • Advanced
  • Size
  • Use External Capturer
  • Audio
  • Session Category, Mode
  • Volume Ratio
  • Mixing Sound
  • Background Policy
  1. iOS

iOS - Media

PreviousiOS - Getting StartedNextWebhook API - Livecast - beta

Last updated 5 years ago

Overview

영상, 음성 미디어의 표출과 사용에 대해 안내합니다.

공통적인 부분은 아래를 참고하세요.

View

Basic

Interface Builder를 통해 StoryBoard를 이용하여 환경설정과 개발을 할 수 있으며, 제공된 SDK를 통해 개별 코드로 View를 구성할 수 있습니다.

Interface Builder를 통한 기본적인 사용은 아래를 참고하세요.

Advanced

Interface Builder를 사용하지 않는 다면 아래 코드를 참조 하세요.

let remonCall = RemonCall()
remonCall.remoteView = myRemoteView
remonCall.localView = myLocalView
RemonCall *remonCall = [[RemonCall alloc] init];
remonCall.remoteView = myRemoteView;
remonCall.localView = myLocalView;

Size

영상 크기값을 얻기 원하신다면 onRemoteVideoSizeChanged 함수와 onLocalVideoSizeChanged 함수를 구현하여 줍니다.

let remonCall = RemonCall()
remonCall.onRemoteVideoSizeChanged {(view, size) in 
    let raito = size.height / size.width
    let oldSize = view.frame.size
    let newFrame = 
    CGRect(x: 0.0, y: 0.0, width: oldSize.width, height: oldSize.width * raito)
    view.frame = newFram
}

RemonCall/RemonCast 에서는 사이즈에 대한 정보만 제공하고, 실제 뷰의 비율을 조정하지않습니다. 특정 비율로 영상을 보여주기 위해서는 LayoutConstraint 등을 사용해 원하는 뷰 크로 조정해야 합니다.

Use External Capturer

2.4.43 버전 부터 기본 RTCCameraCapturer가 아닌 외부 Capturer를 이용 할 수 있도록 지원합니다. 이 기능을 사용하기 위해서는 RemonController의 useExternalCapturer 값을 true로 설정 하고, RemonController의 localExternalCaptureDelegator에게 외부 Capturer로 부터 얻어온 Frame를 넘겨주시면 됩니다.

remonCast.useExternalCapturer = true

remonCast.onCreate { (chid) in
    self.startCapter()
}

func startCapture() {
    YourExCapturer.captureBlock { (pixelBuffer, comTime) in
        if let rtcCaptureDelegate = 
            remonCall.localExternalCaptureDelegator {
                rtcCaptureDelegate.didCaptureFrame(
                    pixelBuffer: pixelBuffer,
                    timeStamp: cmTime, 
                    videoRetation: ._0)
        }
    }
} 
remonCast.useExternalCapturer = YES;

[remonCast onCreateWithBlock:^(NSString * _Nullable chId) {
    [self startCapture];    
}];

- (void)startCapture {
    [yourExCapturer captureBlock: ^(CVPixelBuffer *pixelBuffer, CMTime *cmTime) {
       [remonCast.localExternalCaptureDelegator 
           didCaptureFrameWithPixelBuffer:pixelBuffer 
           timeStamp:cmTime 
           videoRetation:RemonVideoRotation_0]; 
    }];
}

Audio

Session Category, Mode

iOS에서 Audio Session Category, Mode 설정에 따라 스피커출력, 음소거 스위치의 작동, 이어폰 연결 작동, 블루투스 등이 상이 하게 작동할 수 있습니다. 서비스에 따라 AVAudioSession.Category.playback, AVAudioSession.Category.playAndRecord 등을 사용할 수 있습니다. WebRTC 의 기본값은 playAndRecord 이며, 대부분의 방송, 통신에 대해서는 기본값을 권장합니다. 다만 통화, 방송 송출, 방송 시청 등 서비스에 맞춰 필요에 따라 AVAudioSession.Category 를 변경해 사용하실 수 있습니다.

소리 출력 디바이스는 기본적으로 ear piece 로 나오게 되며 스피커로 나오게 하려면 아래와 같은 적용이 필요합니다. RemonCall, RemonCast 생성전에 호출하면 해당 설정이 유지되므로, viewDidLoad() 메쏘드에서 원하는 카테고리와 모드를 설정해 줍니다.

구버전과 최신버전간 사용 api 가 다르므로 아래 코드를 참고하시기 바랍니다.

override func viewDidLoad() {
	super.viewDidLoad()
	
	// sdk 2.6.0 이하버전
	do {
        // 오디오세션 카테고리 설정
        if #available(iOS 10.0, *) {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default)
        }else {
            AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
        }
        try AVAudioSession.sharedInstance().setActive(true, options: [])
        try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
    } catch {
        print(error)
    }
	
	
	// sdk 2.6.10 이상
	// AVAudioSession.Mode.voiceChat : 수화기 사용
	// AVAudioSession.Mode.videoChat : 스피커 사용
	RemonClient.setAudioSessionConfiguration(
                category: AVAudioSession.Category.playAndRecord,
                mode: AVAudioSession.Mode.videoChat,
                options: [] );
}
// Objective-C의 경우 아직 업데이트되지 않았습니다.
//  이 코드는 soloAmbient 카테고리를 사용하고, speaker로 음성을 출력 합니다.
- (void)viewDidLoad {
    [super viewDidLoad];
	@try {
	    NSError *error = nil;
	    [AVAudioSession.sharedInstance setCategory:AVAudioSessionCategorySoloAmbient error:&error];
	    [AVAudioSession.sharedInstance setActive:YES error:&error];
	    [AVAudioSession.sharedInstance overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
	} @catch (NSException *exception) {
	    NSLog(@"error is %@",[exception description]);
	}
}

Audio Session에 대한 모드와 일반적인 사용은 아래 링크를 확인하세요.

Volume Ratio

RemonCast 또는 RemonCall를 music mode로 이용할 경우 outputVolume이 크게 느껴질 수 있습니다. 이럴 경우 volumeRatio 값을 조정 하여 AudioSession outputVolume 과의 출력 비율 조정 할 수 있습니다. 예를 들어 outputVolume이 1.0 (최대값) 일때 volumeRatio를 0.8로 설정 한다면 RemonCast 또는 RemonCall은 outputVolume의 80%의 크기로 출력 되어 집니다.

self.remonCall.volumeRatio = 0.8
[self.remonCall setVolumeRatio:0.8]

Mixing Sound

WebRTC가 동작을 시작 하면 WebRTC가 AVAudioSession을 점유 합니다. 그로 인하여 AVAudioSession을 이용한 효과음 재생에 문제가 발생 합니다. 이 문제를 해결 하기 위하여 OpenAL과 같은 저수준의 효과음 재생 라이브러리 사용을 권장 드리며 OpenAL을 좀 더 쉽게 사용할 수 있게 만들어진 ObjectAL과 같은 라이브러리를 사용 할 수 있습니다.

#import "ObjectAL.h"
#define SHOOT_SOUND @"shoot.caf"

[[OALSimpleAudio sharedInstance] playEffect:SHOOT_SOUND];

Background Policy

백그라운드에서 SDK 연결을 지속적으로 필요하면 아래의 옵션을 Project > Targets > Capabilities > Background Modes 에서 설정하면 됩니다. 백그라운드 설정을 안할 경우 앱이 백그라운드로 진입시 RemoteMonster와의 연결이 종료되어 방송 및 통화가 종료됩니다.

아래는 지속적으로 연결이 되어있을때 작동이며 위 옵션을 키지 않으면 백그라운드시 모든 경우에 영상, 음성의 송출, 수신이 중단됩니다. 단 아래의 동작은 Audio Session Category가 AVAudioSessionCategoryPlayback 일 경우의 동작입니다.

상황

미디어

내용

송출 백그라운

영상

수신측 정지화면(마지막 프레임, FPS 0)이나 음성은 들림

송출 백그라운드

음성

수신측 음성들림

수신 백그라운드

영상

음성은 들을 수 있으며 개발을 통해 백그라운드시 음성을 키거나 끌 수있음

수신 백그라운드

음성

음성은 들을 수 있으며 개발을 통해 백그라운드시 음성을 키거나 끌 수있음

Media
iOS - Getting Started
Audio Session Categories and Modes
Logo
ObjectAL: ObjectAL for iPhone
Apple Developer Documentation
Logo