ARKit 在模型上播放視頻(附進度控制)

國際慣例先上效果圖

Untitled.gif

原理

把模型的material 設(shè)置成AVPlayer  就可以了

SCNMaterial * material = [[SCNMaterial alloc]init];

material.diffuse.contents = self.player;

self.showNode.geometry.materials = @[material];

代碼

//
//  ViewController.m
//  palyVoidOnSCNNode
//
//  Created by LJP on 2018/5/3.
//  Copyright ? 2018年 ljp. All rights reserved.
//

#import "ViewController.h"

@interface ViewController () <ARSCNViewDelegate>

@property (nonatomic, strong) IBOutlet ARSCNView *sceneView;

/**
 *  添加模型按鈕
 */
@property (nonatomic, strong) UIButton * addNodeBtn;

/**
 *  把視頻加在模型上的按鈕
 */
@property (nonatomic, strong) UIButton * playVoidBtn;

/**
 *  播放器對象
 */
@property (nonatomic, strong) AVPlayer *player;

/**
 *  展示的模型
 */
@property (nonatomic, strong) SCNNode *showNode;

/**
 *  調(diào)節(jié)進度的滑竿
 */
@property (nonatomic, strong) UISlider *slider;

/**
 *  調(diào)節(jié)的時間
 */
@property (nonatomic, assign) CMTime chaseTime;

@end

    
@implementation ViewController

#pragma mark ========================= 生命周期 =========================
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self initUI];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];

    [self.sceneView.session runWithConfiguration:configuration];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [self.sceneView.session pause];
}


#pragma mark ========================= 初始化方法 ========================
- (void)initUI {
    
    self.sceneView.delegate = self;
    SCNScene *scene = [SCNScene new];
    self.sceneView.scene = scene;
    
    [self.sceneView addSubview:self.addNodeBtn];
    [self.sceneView addSubview:self.playVoidBtn];
    [self.sceneView addSubview:self.slider];

}


#pragma mark ========================= 私有方法 ==========================
- (void)trySeekToChaseTime{
    
    if (_player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
        
        [self actuallySeekToTime];
        
    }
    
}

- (void)actuallySeekToTime {
    
    CMTime seekTimeInProgress = self.chaseTime;

    [self.player seekToTime:seekTimeInProgress
            toleranceBefore:kCMTimeZero
            toleranceAfter :kCMTimeZero
          completionHandler:^(BOOL finished) {
        
//        [self.player play]; 打開就會自動播放了

    }];
    
}

#pragma mark ========================= 事件處理 ==========================
- (void)clickAddNodeBtn {
    
    [self.sceneView.scene.rootNode addChildNode:self.showNode];
    
}

- (void)clickPlayVoidBtn {
   
    SCNMaterial * material = [[SCNMaterial alloc]init];
    
    material.diffuse.contents = self.player;
    
    self.showNode.geometry.materials = @[material];
    
    [self.player play];
    
}

- (void)playerProcess:(UISlider *)slider{

    NSString * urlStr = [[NSBundle mainBundle]pathForResource:@"movie.MP4" ofType:nil];
    
    NSURL * url = [NSURL fileURLWithPath:urlStr];
    
    AVAsset * asset = [AVAsset assetWithURL:url];
    
    float totalTime = CMTimeGetSeconds(asset.duration);
    
    [self.player pause];
    
    CMTime newChaseTime = CMTimeMake(totalTime * slider.value * asset.duration.timescale, asset.duration.timescale);
    
    self.chaseTime = newChaseTime;
    
    [self actuallySeekToTime];

}


#pragma mark ========================= 代理方法 ==========================


#pragma mark ========================= 訪問器方法 =========================
- (UIButton *)addNodeBtn {
    if (_addNodeBtn == nil) {
        _addNodeBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        _addNodeBtn.frame = CGRectMake(self.view.frame.size.width/4-40, self.view.frame.size.height-160, 80, 48);
        [_addNodeBtn setTitle:@"添加模型" forState:0];
        [_addNodeBtn addTarget:self action:@selector(clickAddNodeBtn) forControlEvents:UIControlEventTouchUpInside];
    }
    return _addNodeBtn;
}

- (UIButton *)playVoidBtn {
    if (_playVoidBtn == nil) {
        _playVoidBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        _playVoidBtn.frame = CGRectMake(self.view.frame.size.width/4*3-40, self.view.frame.size.height-160, 80, 48);
        [_playVoidBtn setTitle:@"播放視頻" forState:0];
        [_playVoidBtn addTarget:self action:@selector(clickPlayVoidBtn) forControlEvents:UIControlEventTouchUpInside];
    }
    return _playVoidBtn;
}

- (UISlider *)slider{
    if (!_slider) {
        _slider = [[UISlider alloc] initWithFrame:CGRectMake(30, 600, 300, 30)];
        _slider.maximumValue = 1;
        _slider.minimumValue = 0;
        _slider.thumbTintColor = [UIColor blueColor];
        _slider.tintColor = [UIColor redColor];
        _slider.continuous = YES;
        [_slider addTarget:self action:@selector(playerProcess:) forControlEvents:UIControlEventValueChanged];
    }
    return _slider;
}

-(AVPlayer *)player{
    if (!_player) {
        AVPlayerItem *playerItem=[self getPlayItem:0];
        _player=[AVPlayer playerWithPlayerItem:playerItem];
    }
    return _player;
}

-(AVPlayerItem *)getPlayItem:(int)videoIndex{
    NSString * urlStr = [[NSBundle mainBundle]pathForResource:@"movie.MP4" ofType:nil];
    
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    
    AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url];
    return playerItem;
}

- (SCNNode *)showNode {
    if (_showNode == nil) {
        _showNode = [SCNNode new];
        SCNBox * box = [SCNBox boxWithWidth:0.3 height:0.3 length:0.3 chamferRadius:0];
        _showNode.geometry = box;
        _showNode.position = SCNVector3Make(0, 0.5, -1);
    }
    return _showNode;
}

@end

代碼

我的博客即將搬運同步至騰訊云+社區(qū)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,062評論 25 709
  • 昨晚寫了一篇《成為一個華德福老師的準(zhǔn)備》,今天便遇到一個同事,見面第一句話問到,“你是明年一年級的主班啊?”我瞬間...
    在水之湄_ym閱讀 279評論 0 1
  • 文/暄妍?若梅在路上孤身跋涉在路上前路茫茫,黑暗崎嶇也許爭不過天與地也許逃不脫生與死也許天道不一定酬勤但是,那又如...
    暄妍若梅閱讀 705評論 6 4
  • 深夜里電話鈴響,是朋友的電話。她說:“忍不住要給你打個電話,我忽然心里難過,非常非常難過,就是這樣,沒別的?!闭f...
    大寶最最最酷閱讀 276評論 2 1
  • 文來著高哥視界 作者:高哥 吃完晚飯后,一歲半的女兒在手機上聽兒歌,老爸在手機上看搞笑視頻和雞湯味十足的段子,媳婦...
    高哥視界閱讀 215評論 0 0

友情鏈接更多精彩內(nèi)容