录制视频和音频

//

//  StartLiveView.m

//  LiveHighCP

//

//  Created by CJW on 16/7/18.

//  Copyright © 2016 cjw. All rights reserved.

//


#import "StartLiveView.h"

#import "UIView+Add.h"

#import "UIControl+Add.h"

#import "LFLiveSession.h"


#define CJWScreenH [UIScreen mainScreen].bounds.size.height

#define CJWScreenW [UIScreen mainScreen].bounds.size.width

@interface StartLiveView()<LFLiveSessionDelegate>

//美颜

@property (nonatomic,strong) UIButton * beautyButton;


//切换前后摄像头

@property (nonatomic,strong) UIButton * cameraButton;


//关闭

@property (nonatomic,strong) UIButton * closeButton;


//开始直播

@property (nonatomic,strong) UIButton * startLiveButton;


@property (nonatomic,strong) UIView * containerView;


@property (nonatomic,strong) LFLiveDebug  * debugInfo;


@property (nonatomic,strong) LFLiveSession * session;


@end


static int padding = 30;

@implementation StartLiveView

-(instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        self.backgroundColor = [UIColor clearColor];

        

        //加载视频录制

        [self requestAccessForVideo];

        

        //加载音频录制

        [self requestAccessForAudio];

        

        //创建界面容器

        [self addSubview:self.containerView];

        

        //添加按钮

        [self.containerView addSubview:self.closeButton];

        [self.containerView addSubview:self.cameraButton];

        [self.containerView addSubview:self.beautyButton];

        [self.containerView addSubview:self.startLiveButton];

    }

    

    

    return self;

}

#pragma mark ---- <加载视频录制>

- (void)requestAccessForVideo{

    __weak typeof(self) _self = self;

    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

    switch (status) {

        case AVAuthorizationStatusNotDetermined:{

            // 许可对话没有出现,发起授权许可

            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {

                if (granted) {

                    dispatch_async(dispatch_get_main_queue(), ^{

                        [_self.session setRunning:YES];

                    });

                }

            }];

            break;

        }

        case AVAuthorizationStatusAuthorized:{

            // 已经开启授权,可继续

            [_self.session setRunning:YES];

            break;

        }

        case AVAuthorizationStatusDenied:

        case AVAuthorizationStatusRestricted:

            // 用户明确地拒绝授权,或者相机设备无法访问

            

            break;

        default:

            break;

    }

}



#pragma mark - 加载音频录制

-(void)requestAccessForAudio

{

    AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];

    switch (status) {

        case AVAuthorizationStatusNotDetermined:{

            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {

                

            }];

            }

            break;

        case AVAuthorizationStatusAuthorized:{

        }

            break;

            

        case AVAuthorizationStatusDenied:

        case AVAuthorizationStatusRestricted:

            break;

        default:

            break;

    }

}

#pragma mark ---- <LFStreamingSessionDelegate>


/** live status changed will callback */

- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state{

    

}


/** live debug info callback */

- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo{

    

}


/** callback socket errorcode */

- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode{

    

}



#pragma mark - 创建会话

-(LFLiveSession *)session

{

    if (!_session) {

        _session = [[LFLiveSession alloc]initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]];

        _session.running = YES;

        _session.preView = self;

    }

    return _session;

}

#pragma mark - 界面容器

-(UIView *)containerView

{

    if (!_containerView)

    {

        _containerView = [UIView new];

        _containerView.frame = self.bounds;

        _containerView.backgroundColor = [UIColor clearColor];

        _containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    }

    return _containerView;

}

#pragma mark - 关闭界面

-(UIButton *)closeButton

{

    if (!_closeButton)

    {

        //位置

        _closeButton.frame = CGRectMake(CJWScreenW - padding * 2, padding, padding, padding);

        

        [_closeButton setImage:[UIImage imageNamed:@"close_preview"] forState:UIControlStateNormal];

        _closeButton.exclusiveTouch = YES;

        __weak __typeof__(self) weakSelf = self;

        [_closeButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {

            [weakSelf.viewController dismissViewControllerAnimated:YES completion:nil];

        }];

    }

    return _closeButton;

}

#pragma mark - 切换摄像头

-(UIButton *)cameraButton

{

     if(!_cameraButton)

     {

         _cameraButton = [UIButton new];

         _cameraButton.frame = CGRectMake(CJWScreenW - padding * 4, padding, padding, padding);

         [_cameraButton setImage:[UIImage imageNamed:@"camra_preview"] forState:UIControlStateNormal];

         _cameraButton.exclusiveTouch = YES;

         __weak typeof(self) _self = self;

         [_cameraButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {

             AVCaptureDevicePosition devicePosion = _self.session.captureDevicePosition;

             // 前后摄像头切换

             _self.session.captureDevicePosition = (devicePosion == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;

         }];

     }

    return _cameraButton;

}

#pragma mark - 美颜功能

-(UIButton *)beautyButton

{

    if (!_beautyButton)

    {

        _beautyButton = [UIButton new];

        _beautyButton.frame = CGRectMake(padding, padding, padding, padding);

        [_beautyButton setImage:[UIImage imageNamed:@"camra_beauty"] forState:UIControlStateSelected];

        [_beautyButton setImage:[UIImage imageNamed:@"camra_beauty_close"] forState:UIControlStateNormal];

        _beautyButton.exclusiveTouch = YES;

        __weak typeof(self) _self = self;

        [_beautyButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {

            _self.session.beautyFace = !_self.session.beautyFace;

            _self.beautyButton.selected = !_self.session.beautyFace;

            

        }];

    }

    return _beautyButton;

}


#pragma mark - 开始录制

//调用LFAPI开始录制)

-(UIButton *)startLiveButton

{

    if (!_startLiveButton) {

        _startLiveButton  = [UIButton new];

        _startLiveButton.frame = CGRectMake((CJWScreenW-200)*0.5, CJWScreenH-100, 200, 40);

        _startLiveButton.layer.cornerRadius = _startLiveButton.frame.size.height * 0.5;

        [_startLiveButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

        [_startLiveButton.titleLabel setFont:[UIFont systemFontOfSize:16]];

        [_startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];

        [_startLiveButton setBackgroundColor:[UIColor grayColor]];

        _startLiveButton.exclusiveTouch = YES;

        __weak typeof(self) _self = self;

        

        [_startLiveButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {

            _self.startLiveButton.selected = !_self.startLiveButton.selected;

            if (_self.startLiveButton.selected) {

                [_self.startLiveButton setTitle:@"结束直播" forState:UIControlStateNormal];

                LFLiveStreamInfo * strem = [LFLiveStreamInfo new];

                strem.url = @"rtmp://daniulive.com:1935/live/stream238";

                [_self.session startLive:strem];

            }

            else

            {

                [_self.startLiveButton setTitle:@"开始直播" forState:UIControlStateNormal];

                [_self.session stopLive];

            }

        }];

    }

    return _startLiveButton;

}



@end























Html5网页纯JavaScript录制MP3音频 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Html5网页JavaScript录制MP3音频</title> <meta charset="utf-8" /> </head> <body> Html5网页JavaScript录制MP3音频 录制 停止 上传 调试信息: [removed][removed] [removed] var recorder = new MP3Recorder({ debug:true, funOk: function () { btnStart.disabled = false; log('初始化成功'); }, funCancel: function (msg) { log(msg); recorder = null; } }); var mp3Blob; function funStart(button) { btnStart.disabled = true; btnStop.disabled = false; btnUpload.disabled = true; log('录音开始...'); recorder.start(); } function funStop(button) { recorder.stop(); btnStart.disabled = false; btnStop.disabled = true; btnUpload.disabled = false; log('录音结束,MP3导出中...'); recorder.getMp3Blob(function (blob) { log('MP3导出成功'); mp3Blob = blob; var url = URL.createObjectURL(mp3Blob); var div = document.createElement('div'); var au = document.createElement('audio'); var hf = document.createElement('a'); au.controls = true; au.src = url; hf.href = url; hf.download = new Date().toISOString() + '.mp3'; hf[removed] = hf.download; div.appendChild(au); div.appendChild(hf); recordingslist.appendChild(div); }); } function log(str) { recordingslist[removed] += str + ''; } function funUpload() { var fd = new FormData(); var mp3Name = encodeURIComponent('audio_recording_' + new Date().getTime() + '.mp3'); fd.append('mp3Name', mp3Name); fd.append('file', mp3Blob); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { recordingslist[removed] += '上传成功:' + mp3Name + ''; } }; xhr.open('POST', 'upload.ashx'); xhr.send(fd); } [removed] </body> </html> [javascript] view plain copy 在CODE上查看代码片派生到我的代码片 (function (exports) { var MP3Recorder = function (config) { var recorder = this; config = config || {}; config.sampleRate = config.sampleRate || 44100; config.bitRate = config.bitRate || 128; navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; if (navigator.getUserMedia) { navigator.getUserMedia({ audio: true }, function (stream) { var context = new AudioContext(), microphone = context.createMediaStreamSource(stream), processor = context.createScriptProcessor(16384, 1, 1),//bufferSize大小,输入channel数,输出channel数 mp3ReceiveSuccess, currentErrorCallback; config.sampleRate = context.sampleRate; processor.onaudioprocess = function (event) { //边录音边转换 var array = event.inputBuffer.getChannelData(0); realTimeWorker.postMessage({ cmd: 'encode', buf: array }); }; var realTimeWorker = new Worker('js/worker-realtime.js'); realTimeWorker.onmessage = function (e) { switch (e.data.cmd) { case 'init': log('初始化成功'); if (config.funOk) { config.funOk(); } break; case 'end': log('MP3大小:', e.data.buf.length); if (mp3ReceiveSuccess) { mp3ReceiveSuccess(new Blob(e.data.buf, { type: 'audio/mp3' })); } break; case 'error': log('错误信息:' + e.data.error); if (currentErrorCallback) { currentErrorCallback(e.data.error); } break; default: log('未知信息:', e.data); } }; recorder.getMp3Blob = function (onSuccess, onError) { currentErrorCallback = onError; mp3ReceiveSuccess = onSuccess; realTimeWorker.postMessage({ cmd: 'finish' }); }; recorder.start = function () { if (processor && microphone) { microphone.connect(processor); processor.connect(context.destination); log('开始录音'); } } recorder.stop = function () { if (processor && microphone) { microphone.disconnect(); processor.disconnect(); log('录音结束'); } } realTimeWorker.postMessage({ cmd: 'init', config: { sampleRate: config.sampleRate, bitRate: config.bitRate } }); }, function (error) { var msg; switch (error.code || error.name) { case 'PERMISSION_DENIED': case 'PermissionDeniedError': msg = '用户拒绝访问麦客风'; break; case 'NOT_SUPPORTED_ERROR': case 'NotSupportedError': msg = '浏览器不支持麦客风'; break; case 'MANDATORY_UNSATISFIED_ERROR': case 'MandatoryUnsatisfiedError': msg = '找不到麦客风设备'; break; default: msg = '无法打开麦克风,异常信息:' + (error.code || error.name); break; } if (config.funCancel) { config.funCancel(msg); } }); } else { if (config.funCancel) { config.funCancel('当前浏览器不支持录音功能'); } } function log(str) { if (config.debug) { console.log(str); } } } exports.MP3Recorder = MP3Recorder; })(window);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值