├── .gitattributes ├── .gitignore ├── AliyunPlayerView.js ├── README.md ├── android ├── build.gradle ├── libs │ ├── AlivcPlayer-3.4.6.aar │ ├── AlivcReporter-1.2.aar │ └── AliyunVodPlayer-3.4.6.aar └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── syan │ ├── AliyunPlayManager.java │ ├── AliyunPlayerView.java │ ├── RNAliyunPlayerModule.java │ └── RNAliyunPlayerPackage.java ├── index.js ├── ios ├── AliyunPlayManager.h ├── AliyunPlayManager.m ├── AliyunPlayerView.h ├── AliyunPlayerView.m ├── RNAliyunPlayer.h ├── RNAliyunPlayer.m ├── RNAliyunPlayer.podspec ├── RNAliyunPlayer.xcodeproj │ └── project.pbxproj ├── RNAliyunPlayer.xcworkspace │ └── contents.xcworkspacedata └── libs │ ├── AliThirdparty.framework │ ├── AliThirdparty │ ├── Headers │ │ └── AliThirdparty.h │ ├── Info.plist │ └── Modules │ │ └── module.modulemap │ ├── AliyunLanguageSource.bundle │ ├── Info.plist │ ├── en.lproj │ │ └── Localizable.strings │ └── zh-Hans.lproj │ │ └── Localizable.strings │ ├── AliyunPlayerSDK.framework │ ├── AliyunPlayerSDK │ ├── Headers │ │ ├── AliVcMediaPlayer.h │ │ ├── AliVcPlayerDefine.h │ │ ├── AliVcPlayerErrorCode.h │ │ ├── AliyunPlayerSDK.h │ │ ├── KernelMPlayer.h │ │ └── MPlayingHandler.h │ ├── Info.plist │ └── Modules │ │ └── module.modulemap │ └── AliyunVodPlayerSDK.framework │ ├── AliyunVodPlayerSDK │ ├── Headers │ ├── AliyunVodDownLoadManager.h │ ├── AliyunVodPlayer.h │ ├── AliyunVodPlayerDefine.h │ ├── AliyunVodPlayerSDK.h │ └── AliyunVodPlayerVideo.h │ ├── Info.plist │ └── Modules │ └── module.modulemap └── package.json /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # OSX 3 | # 4 | .DS_Store 5 | 6 | # node.js 7 | # 8 | node_modules/ 9 | npm-debug.log 10 | yarn-error.log 11 | 12 | 13 | # Xcode 14 | # 15 | build/ 16 | *.pbxuser 17 | !default.pbxuser 18 | *.mode1v3 19 | !default.mode1v3 20 | *.mode2v3 21 | !default.mode2v3 22 | *.perspectivev3 23 | !default.perspectivev3 24 | xcuserdata 25 | *.xccheckout 26 | *.moved-aside 27 | DerivedData 28 | *.hmap 29 | *.ipa 30 | *.xcuserstate 31 | project.xcworkspace 32 | 33 | 34 | # Android/IntelliJ 35 | # 36 | build/ 37 | .idea 38 | .gradle 39 | local.properties 40 | *.iml 41 | 42 | # BUCK 43 | buck-out/ 44 | \.buckd/ 45 | *.keystore 46 | -------------------------------------------------------------------------------- /AliyunPlayerView.js: -------------------------------------------------------------------------------- 1 | // Created by react-native-create-bridge 2 | 3 | import React, {Component} from 'react' 4 | import {requireNativeComponent, NativeModules} from 'react-native' 5 | 6 | const AliyunPlayer = requireNativeComponent('AliyunPlay', AliyunPlayView) 7 | const {AliyunPlayManager} = NativeModules 8 | 9 | export default class AliyunPlayView extends Component { 10 | /** 11 | * 功能:停止播放视频 12 | */ 13 | stop = () => { 14 | AliyunPlayManager.stop() 15 | } 16 | 17 | /** 18 | * 功能:暂停播放视频 19 | * 备注:在start播放视频之后可以调用pause进行暂停。 20 | */ 21 | pause = () => { 22 | AliyunPlayManager.pause() 23 | } 24 | 25 | /** 26 | * 功能:恢复播放视频 27 | * 备注:在pause暂停视频之后可以调用resume进行播放。 28 | */ 29 | resume = () => { 30 | AliyunPlayManager.resume() 31 | } 32 | 33 | /** 34 | * 功能:跳转到指定位置进行播放,单位为秒 35 | * @param time 36 | */ 37 | seekToTime = (time) => { 38 | AliyunPlayManager.seekToTime(time) 39 | } 40 | 41 | render() { 42 | return this.aliyunPlay = ref}{...this.props} /> 43 | } 44 | } 45 | 46 | // AliyunPlayView.propTypes = { 47 | // exampleProp: React.PropTypes.any 48 | // } 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # react-native-aliyun-player 3 | 4 | ## Getting started 5 | 6 | `$ npm install react-native-aliyun-player --save` 7 | 8 | ### Mostly automatic installation 9 | 10 | `$ react-native link react-native-aliyun-player` 11 | 12 | ### 安卓 13 | 请使用真机 14 | ```$xslt 15 | app的gradle文件添加 16 | android{ 17 | ... 18 | packagingOptions { 19 | pickFirst 'lib/armeabi-v7a/libgnustl_shared.so' 20 | pickFirst 'lib/arm64-v8a/libgnustl_shared.so' 21 | pickFirst 'lib/x86_64/libgnustl_shared.so' 22 | pickFirst 'lib/x86/libgnustl_shared.so' 23 | } 24 | } 25 | 26 | repositories { 27 | flatDir { 28 | dirs project(':react-native-aliyun-player').file('libs') 29 | } 30 | } 31 | ``` 32 | 33 | ### Manual installation 34 | 35 | 36 | #### iOS 37 | 38 | 1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` 39 | 2. Go to `node_modules` ➜ `react-native-aliyun-player` and add `RNAliyunPlayer.xcodeproj` 40 | 3. In XCode, in the project navigator, select your project. Add `libRNAliyunPlayer.a` to your project's `Build Phases` ➜ `Link Binary With Libraries` 41 | 4. Run your project (`Cmd+R`)< 42 | 43 | #### Android 44 | 45 | 1. Open up `android/app/src/main/java/[...]/MainActivity.java` 46 | - Add `import com.syan.RNAliyunPlayerPackage;` to the imports at the top of the file 47 | - Add `new RNAliyunPlayerPackage()` to the list returned by the `getPackages()` method 48 | 2. Append the following lines to `android/settings.gradle`: 49 | ``` 50 | include ':react-native-aliyun-player' 51 | project(':react-native-aliyun-player').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-aliyun-player/android') 52 | ``` 53 | 3. Insert the following lines inside the dependencies block in `android/app/build.gradle`: 54 | ``` 55 | compile project(':react-native-aliyun-player') 56 | ``` 57 | 58 | #### Windows 59 | [Read it! :D](https://github.com/ReactWindows/react-native) 60 | 61 | 1. In Visual Studio add the `RNAliyunPlayer.sln` in `node_modules/react-native-aliyun-player/windows/RNAliyunPlayer.sln` folder to their solution, reference from their app. 62 | 2. Open up your `MainPage.cs` app 63 | - Add `using Aliyun.Player.RNAliyunPlayer;` to the usings at the top of the file 64 | - Add `new RNAliyunPlayerPackage()` to the `List` returned by the `Packages` method 65 | 66 | 67 | ## Usage 68 | ```javascript 69 | import RNAliyunPlayer from 'react-native-aliyun-player'; 70 | 71 | // TODO: What to do with the module? 72 | RNAliyunPlayer; 73 | ``` 74 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | buildscript { 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.0.1' 10 | } 11 | } 12 | 13 | apply plugin: 'com.android.library' 14 | 15 | android { 16 | compileSdkVersion 26 17 | buildToolsVersion '26.0.2' 18 | 19 | defaultConfig { 20 | minSdkVersion 16 21 | targetSdkVersion 22 22 | versionCode 1 23 | versionName "1.0" 24 | } 25 | lintOptions { 26 | abortOnError false 27 | } 28 | 29 | } 30 | 31 | repositories { 32 | mavenCentral() 33 | 34 | } 35 | 36 | 37 | repositories { 38 | flatDir { 39 | dirs 'libs' 40 | } 41 | } 42 | 43 | dependencies { 44 | compile 'com.facebook.react:react-native:+' 45 | 46 | compile(name: 'AlivcReporter-1.2', ext: 'aar') 47 | compile(name: 'AlivcPlayer-3.4.6', ext: 'aar') 48 | compile(name: 'AliyunVodPlayer-3.4.6', ext: 'aar') 49 | 50 | } 51 | -------------------------------------------------------------------------------- /android/libs/AlivcPlayer-3.4.6.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/android/libs/AlivcPlayer-3.4.6.aar -------------------------------------------------------------------------------- /android/libs/AlivcReporter-1.2.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/android/libs/AlivcReporter-1.2.aar -------------------------------------------------------------------------------- /android/libs/AliyunVodPlayer-3.4.6.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/android/libs/AliyunVodPlayer-3.4.6.aar -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/src/main/java/com/syan/AliyunPlayManager.java: -------------------------------------------------------------------------------- 1 | package com.syan; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.util.Log; 6 | import android.view.SurfaceHolder; 7 | import android.view.SurfaceView; 8 | 9 | import com.facebook.react.bridge.Arguments; 10 | import com.facebook.react.bridge.ReactContext; 11 | import com.facebook.react.bridge.ReadableMap; 12 | import com.facebook.react.bridge.WritableMap; 13 | import com.facebook.react.common.MapBuilder; 14 | import com.facebook.react.uimanager.SimpleViewManager; 15 | import com.facebook.react.uimanager.ThemedReactContext; 16 | import com.facebook.react.uimanager.annotations.ReactProp; 17 | 18 | import com.alivc.player.VcPlayerLog; 19 | import com.aliyun.vodplayer.media.AliyunVidSts; 20 | import com.aliyun.vodplayer.media.IAliyunVodPlayer; 21 | import com.aliyun.vodplayer.media.AliyunVodPlayer; 22 | import com.facebook.react.uimanager.events.RCTEventEmitter; 23 | 24 | import java.lang.ref.WeakReference; 25 | import java.util.Map; 26 | 27 | import javax.annotation.Nullable; 28 | 29 | public class AliyunPlayManager extends SimpleViewManager { 30 | private static final String TAG = "AliyunPlayManager"; 31 | public static final String REACT_CLASS = "AliyunPlay"; 32 | private static final String PLAYING_CALLBACK = "onPlayingCallback"; 33 | private static final String EVENT_CALLBACK = "onEventCallback"; 34 | 35 | //视频画面 36 | private SurfaceView mSurfaceView; 37 | // 组件view 38 | private AliyunPlayerView mAliyunPlayerView; 39 | //播放器 40 | private AliyunVodPlayer mAliyunVodPlayer; 41 | // 播放进度计时器 42 | private ProgressUpdateTimer mProgressUpdateTimer; 43 | // 事件发送者 44 | private RCTEventEmitter mEventEmitter; 45 | 46 | @Override 47 | public String getName() { 48 | return REACT_CLASS; 49 | } 50 | 51 | @Override 52 | public AliyunPlayerView createViewInstance(ThemedReactContext context) { 53 | //reactContext = context; 54 | mEventEmitter = context.getJSModule(RCTEventEmitter.class); 55 | mProgressUpdateTimer = new ProgressUpdateTimer(AliyunPlayManager.this); 56 | AliyunPlayerView view = new AliyunPlayerView(context); 57 | mAliyunPlayerView = view; 58 | 59 | mSurfaceView = new SurfaceView(context); 60 | view.addView(mSurfaceView); 61 | SurfaceHolder holder = mSurfaceView.getHolder(); 62 | 63 | mAliyunVodPlayer = new AliyunVodPlayer(context); 64 | mAliyunVodPlayer.setDisplay(holder); 65 | 66 | //增加surfaceView的监听 67 | holder.addCallback(new SurfaceHolder.Callback() { 68 | @Override 69 | public void surfaceCreated(SurfaceHolder surfaceHolder) { 70 | VcPlayerLog.d(TAG, " surfaceCreated = surfaceHolder = " + surfaceHolder); 71 | mAliyunVodPlayer.setDisplay(surfaceHolder); 72 | } 73 | 74 | @Override 75 | public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, 76 | int height) { 77 | VcPlayerLog.d(TAG, " surfaceChanged surfaceHolder = " + surfaceHolder + " , width = " + width + " , height = " + height); 78 | mAliyunVodPlayer.surfaceChanged(); 79 | } 80 | 81 | @Override 82 | public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 83 | VcPlayerLog.d(TAG, " surfaceDestroyed = surfaceHolder = " + surfaceHolder); 84 | } 85 | }); 86 | 87 | return view; 88 | } 89 | 90 | /** 91 | * 准备视频(异步) 92 | */ 93 | @ReactProp(name = "prepareAsyncParams") 94 | public void setPrepareAsyncParams(AliyunPlayerView view, ReadableMap options) { 95 | 96 | String type = options.getString("type"); 97 | 98 | switch (type) { 99 | // 使用vid+STS方式播放(点播用户推荐使用) 100 | case "vidSts": 101 | String vid = options.getString("vid"); 102 | String accessKeyId = options.getString("accessKeyId"); 103 | String accessKeySecret = options.getString("accessKeySecret"); 104 | String securityToken = options.getString("securityToken"); 105 | 106 | AliyunVidSts mVidSts = new AliyunVidSts(); 107 | mVidSts.setVid(vid); 108 | mVidSts.setAcId(accessKeyId); 109 | mVidSts.setAkSceret(accessKeySecret); 110 | mVidSts.setSecurityToken(securityToken); 111 | 112 | mAliyunVodPlayer.prepareAsync(mVidSts); 113 | break; 114 | 115 | default: 116 | Log.e(TAG, "prepareAsync" + type); 117 | break; 118 | } 119 | } 120 | 121 | // this.onListener(); 122 | 123 | 124 | @Override 125 | protected void addEventEmitters(ThemedReactContext reactContext, AliyunPlayerView view) { 126 | this.onListener(reactContext, view); 127 | } 128 | 129 | /** 130 | * 播放器监听事件 131 | * @param reactContext 132 | * @param view 133 | */ 134 | private void onListener(final ThemedReactContext reactContext, AliyunPlayerView view) { 135 | 136 | Log.e(TAG, "版本号" + AliyunVodPlayer.getSDKVersion()); 137 | 138 | mAliyunVodPlayer.setOnPreparedListener(new IAliyunVodPlayer.OnPreparedListener() { 139 | @Override 140 | public void onPrepared() { 141 | Log.e(TAG, "onPrepared"); 142 | mAliyunVodPlayer.start(); 143 | //准备完成触发 144 | 145 | // TODO:待优化的 listener 处理,应该新建个独立文件处理? 146 | WritableMap body = Arguments.createMap(); 147 | body.putInt("event", mAliyunVodPlayer.getPlayerState().ordinal()); 148 | mEventEmitter.receiveEvent(mAliyunPlayerView.getId(), EVENT_CALLBACK, body); 149 | } 150 | }); 151 | 152 | // 第一帧显示 153 | mAliyunVodPlayer.setOnFirstFrameStartListener(new IAliyunVodPlayer.OnFirstFrameStartListener() { 154 | @Override 155 | public void onFirstFrameStart() { 156 | // 开始启动更新进度的定时器 157 | startProgressUpdateTimer(); 158 | // TODO:待优化的 listener 处理,应该新建个独立文件处理? 159 | WritableMap body = Arguments.createMap(); 160 | body.putInt("event", mAliyunVodPlayer.getPlayerState().ordinal()); 161 | mEventEmitter.receiveEvent(mAliyunPlayerView.getId(), EVENT_CALLBACK, body); 162 | } 163 | }); 164 | 165 | mAliyunVodPlayer.setOnErrorListener(new IAliyunVodPlayer.OnErrorListener() { 166 | @Override 167 | public void onError(int errorCode, int errorEvent, String errorMsg) { 168 | Log.e(TAG, "onError" + errorMsg); 169 | // 停止定时器 170 | stopProgressUpdateTimer(); 171 | } 172 | }); 173 | 174 | } 175 | 176 | /** 177 | * 开始播放进度计时器 178 | */ 179 | private void startProgressUpdateTimer() { 180 | if (mProgressUpdateTimer != null) { 181 | mProgressUpdateTimer.removeMessages(0); 182 | mProgressUpdateTimer.sendEmptyMessageDelayed(0, 1000); 183 | } 184 | } 185 | 186 | /** 187 | * 停止播放进度计时器 188 | */ 189 | private void stopProgressUpdateTimer() { 190 | if (mProgressUpdateTimer != null) { 191 | mProgressUpdateTimer.removeMessages(0); 192 | } 193 | } 194 | 195 | /** 196 | * 更新播放进度 197 | */ 198 | private void handlePlayingMessage(Message message) { 199 | if (mAliyunVodPlayer != null) { 200 | long currentTime = mAliyunVodPlayer.getCurrentPosition(); 201 | long duration = mAliyunVodPlayer.getDuration(); 202 | WritableMap body = Arguments.createMap(); 203 | body.putString("currentTime", currentTime + ""); 204 | body.putString("duration", duration + ""); 205 | mEventEmitter.receiveEvent(mAliyunPlayerView.getId(), PLAYING_CALLBACK, body); 206 | } 207 | 208 | startProgressUpdateTimer(); 209 | } 210 | 211 | /** 212 | * 播放进度计时器 213 | */ 214 | private static class ProgressUpdateTimer extends Handler { 215 | private WeakReference managerWeakReference; 216 | 217 | ProgressUpdateTimer(AliyunPlayManager playManager) { 218 | managerWeakReference = new WeakReference(playManager); 219 | } 220 | 221 | @Override 222 | public void handleMessage(Message msg) { 223 | AliyunPlayManager playManager = managerWeakReference.get(); 224 | if (playManager != null) { 225 | playManager.handlePlayingMessage(msg); 226 | } 227 | super.handleMessage(msg); 228 | } 229 | } 230 | 231 | @Nullable 232 | @Override 233 | public Map getExportedCustomDirectEventTypeConstants() { 234 | MapBuilder.Builder builder = MapBuilder.builder(); 235 | builder.put(EVENT_CALLBACK, MapBuilder.of("registrationName", EVENT_CALLBACK)); 236 | builder.put(PLAYING_CALLBACK, MapBuilder.of("registrationName", PLAYING_CALLBACK)); 237 | return builder.build(); 238 | } 239 | } 240 | -------------------------------------------------------------------------------- /android/src/main/java/com/syan/AliyunPlayerView.java: -------------------------------------------------------------------------------- 1 | package com.syan; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.LinearLayout; 6 | 7 | /** 8 | * Created by DB on 2017/6/27. 9 | */ 10 | 11 | public class AliyunPlayerView extends LinearLayout { 12 | 13 | public AliyunPlayerView(Context context) { 14 | super(context); 15 | } 16 | 17 | public AliyunPlayerView(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | 22 | public AliyunPlayerView(Context context, AttributeSet attrs, int defStyleAttr) { 23 | super(context, attrs, defStyleAttr); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /android/src/main/java/com/syan/RNAliyunPlayerModule.java: -------------------------------------------------------------------------------- 1 | 2 | package com.syan; 3 | 4 | import com.facebook.react.bridge.ReactApplicationContext; 5 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 6 | import com.facebook.react.bridge.ReactMethod; 7 | import com.facebook.react.bridge.Callback; 8 | 9 | public class RNAliyunPlayerModule extends ReactContextBaseJavaModule { 10 | 11 | private final ReactApplicationContext reactContext; 12 | 13 | public RNAliyunPlayerModule(ReactApplicationContext reactContext) { 14 | super(reactContext); 15 | this.reactContext = reactContext; 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return "RNAliyunPlayer"; 21 | } 22 | } -------------------------------------------------------------------------------- /android/src/main/java/com/syan/RNAliyunPlayerPackage.java: -------------------------------------------------------------------------------- 1 | 2 | package com.syan; 3 | 4 | import java.util.Arrays; 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.bridge.NativeModule; 10 | import com.facebook.react.bridge.ReactApplicationContext; 11 | import com.facebook.react.uimanager.ViewManager; 12 | import com.facebook.react.bridge.JavaScriptModule; 13 | public class RNAliyunPlayerPackage implements ReactPackage { 14 | @Override 15 | public List createNativeModules(ReactApplicationContext reactContext) { 16 | return Arrays.asList(new RNAliyunPlayerModule(reactContext)); 17 | } 18 | 19 | // Deprecated from RN 0.47 20 | public List> createJSModules() { 21 | return Collections.emptyList(); 22 | } 23 | 24 | public List createViewManagers(ReactApplicationContext reactContext) { 25 | // Register your native component's view manager 26 | // https://facebook.github.io/react-native/docs/native-components-android.html#4-register-the-viewmanager 27 | return Arrays.asList( 28 | new AliyunPlayManager() 29 | ); 30 | } 31 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import AliyunPlayerView from './AliyunPlayerView' 2 | 3 | export default AliyunPlayerView; 4 | -------------------------------------------------------------------------------- /ios/AliyunPlayManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunPlayManager.h 3 | // AliyunPalyDemo 4 | // 5 | // Created by 邓博 on 2018/7/4. 6 | // Copyright © 2018年 Facebook. All rights reserved. 7 | // 8 | 9 | // import RCTViewManager 10 | #if __has_include() 11 | #import 12 | #elif __has_include(“RCTViewManager.h”) 13 | #import “RCTViewManager.h” 14 | #else 15 | #import “React/RCTViewManager.h” // Required when used as a Pod in a Swift project 16 | #endif 17 | #import "AliyunPlayerView.h" 18 | 19 | // Subclass your view manager off the RCTViewManager 20 | // http://facebook.github.io/react-native/docs/native-components-ios.html#ios-mapview-example 21 | @interface AliyunPlayManager : RCTViewManager 22 | 23 | @property (nonatomic, strong) AliyunPlayerView *playerView; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ios/AliyunPlayManager.m: -------------------------------------------------------------------------------- 1 | // Created by react-native-create-bridge 2 | #import 3 | #import "AliyunPlayManager.h" 4 | 5 | #if __has_include() 6 | #import 7 | #elif __has_include(“RCTBridge.h”) 8 | #import “RCTBridge.h” 9 | #else 10 | #import “React/RCTBridge.h” // Required when used as a Pod in a Swift project 11 | #endif 12 | 13 | @implementation AliyunPlayManager 14 | 15 | @synthesize bridge = _bridge; 16 | 17 | RCT_EXPORT_MODULE(); 18 | 19 | RCT_EXPORT_VIEW_PROPERTY(prepareAsyncParams, NSDictionary) 20 | RCT_EXPORT_VIEW_PROPERTY(muteMode, BOOL) 21 | RCT_EXPORT_VIEW_PROPERTY(quality, NSInteger) 22 | RCT_EXPORT_VIEW_PROPERTY(volume, float) 23 | RCT_EXPORT_VIEW_PROPERTY(brightness, float) 24 | 25 | RCT_EXPORT_VIEW_PROPERTY(onGetAliyunMediaInfo, RCTBubblingEventBlock) 26 | RCT_EXPORT_VIEW_PROPERTY(onEventCallback, RCTBubblingEventBlock) 27 | RCT_EXPORT_VIEW_PROPERTY(onPlayingCallback, RCTBubblingEventBlock) 28 | RCT_EXPORT_VIEW_PROPERTY(onPlayBackErrorModel, RCTBubblingEventBlock) 29 | RCT_EXPORT_VIEW_PROPERTY(onSwitchToQuality, RCTBubblingEventBlock) 30 | 31 | 32 | 33 | - (UIView *)view 34 | { 35 | AliyunPlayerView *playerView = [AliyunPlayerView new]; 36 | self.playerView = playerView; 37 | return playerView; 38 | } 39 | 40 | #pragma mark - 开始播放 41 | RCT_EXPORT_METHOD(start) { 42 | [self.playerView.aliPlayer start]; 43 | } 44 | 45 | RCT_EXPORT_METHOD(resume) { 46 | [self.playerView.aliPlayer resume]; 47 | } 48 | 49 | RCT_EXPORT_METHOD(pause) { 50 | [self.playerView.aliPlayer pause]; 51 | } 52 | 53 | RCT_EXPORT_METHOD(stop) { 54 | [self.playerView.aliPlayer stop]; 55 | } 56 | 57 | RCT_EXPORT_METHOD(seekToTime:(double)time) { 58 | [self.playerView.aliPlayer seekToTime: time]; 59 | } 60 | 61 | RCT_EXPORT_METHOD(playerState) { 62 | 63 | } 64 | 65 | //getAliyunMediaInfo 66 | 67 | - (dispatch_queue_t)methodQueue 68 | { 69 | return dispatch_get_main_queue(); 70 | } 71 | 72 | + (BOOL)requiresMainQueueSetup 73 | { 74 | return YES; 75 | } 76 | 77 | @end 78 | -------------------------------------------------------------------------------- /ios/AliyunPlayerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunPlayerView.h 3 | // AliyunPlayerDemo 4 | // 5 | // Created by cookiej on 2018/7/22. 6 | // Copyright © 2018年 Facebook. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | @interface AliyunPlayerView : UIView 14 | 15 | @property (nonatomic, strong) AliyunVodPlayer *aliPlayer; 16 | 17 | @property (nonatomic, copy) RCTBubblingEventBlock onEventCallback; 18 | @property (nonatomic, copy) RCTBubblingEventBlock onGetAliyunMediaInfo; 19 | @property (nonatomic, copy) RCTBubblingEventBlock onPlayingCallback; 20 | @property (nonatomic, copy) RCTBubblingEventBlock onSwitchToQuality; 21 | @property (nonatomic, copy) RCTBubblingEventBlock onPlayBackErrorModel; 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ios/AliyunPlayerView.m: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunPlayerView.m 3 | // AliyunPlayerDemo 4 | // 5 | // Created by cookiej on 2018/7/22. 6 | // Copyright © 2018年 Facebook. All rights reserved. 7 | // 8 | 9 | #import "AliyunPlayerView.h" 10 | #define WeakObj(o) __weak typeof(o) o##Weak = o; 11 | 12 | @interface AliyunPlayerView () 13 | 14 | @property (nonatomic, strong) NSDictionary *prepareAsyncParams; 15 | @property (nonatomic, strong) NSTimer *timer; 16 | 17 | @end 18 | 19 | @implementation AliyunPlayerView 20 | 21 | - (void)dealloc { 22 | if (_aliPlayer) { 23 | // 销毁 24 | [_aliPlayer releasePlayer]; 25 | if (_timer) { 26 | [self clearTimer]; 27 | } 28 | _aliPlayer = nil; 29 | } 30 | } 31 | 32 | #pragma mark - Props config 33 | - (void)setPrepareAsyncParams:(NSDictionary *)prepareAsyncParams { 34 | _prepareAsyncParams = prepareAsyncParams; 35 | [self setupAliPlayer]; 36 | } 37 | 38 | - (void)setMuteMode:(BOOL)muteMode { 39 | self.aliPlayer.muteMode = muteMode; 40 | } 41 | 42 | - (void)setQuality:(NSInteger)quality { 43 | self.aliPlayer.quality = quality; 44 | } 45 | 46 | - (void)setVolume:(float)volume { 47 | self.aliPlayer.volume = volume; 48 | } 49 | 50 | - (void)setBrightness:(float)brightness { 51 | self.aliPlayer.brightness = brightness; 52 | } 53 | 54 | - (void)setupAliPlayer { 55 | [self addSubview:self.aliPlayer.playerView]; 56 | 57 | NSString *type = [_prepareAsyncParams objectForKey:@"type"]; 58 | if ([type isEqualToString:@"vidSts"]) { 59 | NSString *vid = [_prepareAsyncParams objectForKey:@"vid"]; 60 | NSString *accessKeyId = [_prepareAsyncParams objectForKey:@"accessKeyId"]; 61 | NSString *accessKeySecret = [_prepareAsyncParams objectForKey:@"accessKeySecret"]; 62 | NSString *securityToken = [_prepareAsyncParams objectForKey:@"securityToken"]; 63 | [self.aliPlayer prepareWithVid:vid accessKeyId:accessKeyId accessKeySecret:accessKeySecret securityToken:securityToken]; 64 | } 65 | } 66 | 67 | - (void) layoutSubviews { 68 | [super layoutSubviews]; 69 | for(UIView* view in self.subviews) { 70 | [view setFrame:self.bounds]; 71 | } 72 | } 73 | 74 | #pragma mark - 播放器初始化 75 | -(AliyunVodPlayer *)aliPlayer{ 76 | if (!_aliPlayer) { 77 | _aliPlayer = [[AliyunVodPlayer alloc] init]; 78 | _aliPlayer.delegate = self; 79 | _aliPlayer.quality= 0; 80 | _aliPlayer.circlePlay = YES; 81 | _aliPlayer.autoPlay = NO; 82 | NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 83 | NSString *docDir = [pathArray objectAtIndex:0]; 84 | //maxsize: MB, maxDuration: second 85 | [_aliPlayer setPlayingCache:YES saveDir:docDir maxSize:3000 maxDuration:100000]; 86 | } 87 | return _aliPlayer; 88 | } 89 | 90 | #pragma mark - AliyunVodPlayerDelegate 91 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer onEventCallback:(AliyunVodPlayerEvent)event{ 92 | NSLog(@"onEventCallback: %ld", event); 93 | 94 | NSMutableDictionary *callbackExt = [NSMutableDictionary dictionary]; 95 | //这里监控播放事件回调 96 | //主要事件如下: 97 | switch (event) { 98 | case AliyunVodPlayerEventPrepareDone: 99 | //播放准备完成时触发 100 | [_aliPlayer start]; 101 | if (self.onGetAliyunMediaInfo) { 102 | NSMutableDictionary *info = [NSMutableDictionary dictionary]; 103 | 104 | AliyunVodPlayerVideo *video = [vodPlayer getAliyunMediaInfo]; 105 | info[@"videoId"] = video.videoId; 106 | info[@"title"] = video.title; 107 | info[@"duration"] = @(video.duration); 108 | info[@"coverUrl"] = video.coverUrl; 109 | info[@"videoQuality"] = @(video.videoQuality); 110 | info[@"videoDefinition"] = video.videoDefinition; 111 | info[@"allSupportQualitys"] = video.allSupportQualitys; 112 | self.onGetAliyunMediaInfo(info); 113 | } 114 | break; 115 | case AliyunVodPlayerEventPlay: 116 | //暂停后恢复播放时触发 117 | [self setupTimer]; 118 | break; 119 | case AliyunVodPlayerEventFirstFrame: 120 | //播放视频首帧显示出来时触发 121 | [self setupTimer]; 122 | break; 123 | case AliyunVodPlayerEventPause: 124 | //视频暂停时触发 125 | [self clearTimer]; 126 | break; 127 | case AliyunVodPlayerEventStop: 128 | //主动使用stop接口时触发 129 | break; 130 | case AliyunVodPlayerEventFinish: 131 | //视频正常播放完成时触发 132 | break; 133 | case AliyunVodPlayerEventBeginLoading: 134 | //视频开始载入时触发 135 | break; 136 | case AliyunVodPlayerEventEndLoading: 137 | //视频加载完成时触发 138 | break; 139 | case AliyunVodPlayerEventSeekDone: 140 | //视频Seek完成时触发 141 | break; 142 | default: 143 | break; 144 | } 145 | 146 | [callbackExt setObject:@(event) forKey:@"event"]; 147 | if (self.onEventCallback) { 148 | self.onEventCallback(callbackExt); 149 | } 150 | } 151 | 152 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer playBackErrorModel:(AliyunPlayerVideoErrorModel *)errorModel{ 153 | //播放出错时触发,通过errorModel可以查看错误码、错误信息、视频ID、视频地址和requestId。 154 | NSLog(@"errorModel: %d", errorModel.errorCode); 155 | if (self.onPlayBackErrorModel) { 156 | self.onPlayBackErrorModel(@{ 157 | @"errorCode": @(errorModel.errorCode), 158 | @"errorMsg": errorModel.errorMsg, 159 | @"errorVid": errorModel.errorVid, 160 | @"errorUrl": errorModel.errorUrl, 161 | @"errorRequestId": errorModel.errorRequestId 162 | } 163 | ); 164 | } 165 | } 166 | - (void)vodPlayer:(AliyunVodPlayer*)vodPlayer willSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{ 167 | //将要切换清晰度时触发 168 | NSLog(@"willSwitchToQuality:%@", videoDefinition); 169 | if (self.onSwitchToQuality) { 170 | self.onSwitchToQuality(@{ 171 | @"type": @"will", 172 | @"quality": @(quality), 173 | @"videoDefinition": videoDefinition} 174 | ); 175 | } 176 | } 177 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer didSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{ 178 | //清晰度切换完成后触发 179 | if (self.onSwitchToQuality) { 180 | self.onSwitchToQuality(@{ 181 | @"type": @"did", 182 | @"quality": @(quality), 183 | @"videoDefinition": videoDefinition} 184 | ); 185 | } 186 | 187 | } 188 | - (void)vodPlayer:(AliyunVodPlayer*)vodPlayer failSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{ 189 | //清晰度切换失败触发 190 | if (self.onSwitchToQuality) { 191 | self.onSwitchToQuality(@{ 192 | @"type": @"fail", 193 | @"quality": @(quality), 194 | @"videoDefinition": videoDefinition} 195 | ); 196 | } 197 | 198 | } 199 | - (void)onCircleStartWithVodPlayer:(AliyunVodPlayer*)vodPlayer{ 200 | //开启循环播放功能,开始循环播放时接收此事件。 201 | } 202 | - (void)onTimeExpiredErrorWithVodPlayer:(AliyunVodPlayer *)vodPlayer{ 203 | //播放器鉴权数据过期回调,出现过期可重新prepare新的地址或进行UI上的错误提醒。 204 | } 205 | /* 206 | *功能:播放过程中鉴权即将过期时提供的回调消息(过期前一分钟回调) 207 | *参数:videoid:过期时播放的videoId 208 | *参数:quality:过期时播放的清晰度,playauth播放方式和STS播放方式有效。 209 | *参数:videoDefinition:过期时播放的清晰度,MPS播放方式时有效。 210 | *备注:使用方法参考高级播放器-点播。 211 | */ 212 | - (void)vodPlayerPlaybackAddressExpiredWithVideoId:(NSString *)videoId quality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition{ 213 | //鉴权有效期为2小时,在这个回调里面可以提前请求新的鉴权,stop上一次播放,prepare新的地址,seek到当前位置 214 | } 215 | 216 | #pragma mark - Timer 217 | - (void)setupTimer { 218 | if (!_timer) { 219 | WeakObj(self) 220 | _timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) { 221 | if (selfWeak.aliPlayer) { 222 | NSDictionary *callbackExt = @{ 223 | @"currentTime": @(selfWeak.aliPlayer.currentTime), 224 | @"duration": @(selfWeak.aliPlayer.duration) 225 | }; 226 | if (selfWeak.onPlayingCallback) { 227 | selfWeak.onPlayingCallback(callbackExt); 228 | } 229 | NSLog(@"Timer is keep running... %@", callbackExt); 230 | } 231 | }]; 232 | [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; 233 | } else { 234 | [self clearTimer]; 235 | [self setupTimer]; 236 | } 237 | } 238 | 239 | - (void)clearTimer { 240 | [_timer invalidate]; 241 | _timer = nil; 242 | } 243 | 244 | - (dispatch_queue_t)methodQueue 245 | { 246 | return dispatch_get_main_queue(); 247 | } 248 | 249 | @end 250 | -------------------------------------------------------------------------------- /ios/RNAliyunPlayer.h: -------------------------------------------------------------------------------- 1 | 2 | #if __has_include("RCTBridgeModule.h") 3 | #import "RCTBridgeModule.h" 4 | #else 5 | #import 6 | #endif 7 | 8 | @interface RNAliyunPlayer : NSObject 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ios/RNAliyunPlayer.m: -------------------------------------------------------------------------------- 1 | 2 | #import "RNAliyunPlayer.h" 3 | 4 | @implementation RNAliyunPlayer 5 | 6 | - (dispatch_queue_t)methodQueue 7 | { 8 | return dispatch_get_main_queue(); 9 | } 10 | RCT_EXPORT_MODULE() 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ios/RNAliyunPlayer.podspec: -------------------------------------------------------------------------------- 1 | 2 | Pod::Spec.new do |s| 3 | s.name = "RNAliyunPlayer" 4 | s.version = "1.0.0" 5 | s.summary = "RNAliyunPlayer" 6 | s.description = <<-DESC 7 | RNAliyunPlayer 8 | DESC 9 | s.homepage = "" 10 | s.license = "MIT" 11 | # s.license = { :type => "MIT", :file => "FILE_LICENSE" } 12 | s.author = { "author" => "author@domain.cn" } 13 | s.platform = :ios, "7.0" 14 | s.source = { :git => "https://github.com/author/RNAliyunPlayer.git", :tag => "master" } 15 | s.source_files = "RNAliyunPlayer/**/*.{h,m}" 16 | s.requires_arc = true 17 | 18 | 19 | s.dependency "React" 20 | #s.dependency "others" 21 | 22 | end 23 | 24 | -------------------------------------------------------------------------------- /ios/RNAliyunPlayer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3490AF6C2104834B00147CC2 /* AliyunPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3490AF6B2104834B00147CC2 /* AliyunPlayerView.m */; }; 11 | B3E7B58A1CC2AC0600A0062D /* RNAliyunPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* RNAliyunPlayer.m */; }; 12 | B8A4717020F44FBD00051544 /* AliyunPlayManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B8A4716F20F44FBD00051544 /* AliyunPlayManager.m */; }; 13 | B8A471CF20F4543400051544 /* AliThirdparty.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8A471CB20F4543400051544 /* AliThirdparty.framework */; }; 14 | B8A471D020F4543400051544 /* AliyunVodPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8A471CD20F4543400051544 /* AliyunVodPlayerSDK.framework */; }; 15 | B8A471D120F4543400051544 /* AliyunPlayerSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8A471CE20F4543400051544 /* AliyunPlayerSDK.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 58B511D91A9E6C8500147676 /* CopyFiles */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = "include/$(PRODUCT_NAME)"; 23 | dstSubfolderSpec = 16; 24 | files = ( 25 | ); 26 | runOnlyForDeploymentPostprocessing = 0; 27 | }; 28 | /* End PBXCopyFilesBuildPhase section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 134814201AA4EA6300B7C361 /* libRNAliyunPlayer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNAliyunPlayer.a; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 3490AF6A2104834A00147CC2 /* AliyunPlayerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AliyunPlayerView.h; sourceTree = ""; }; 33 | 3490AF6B2104834B00147CC2 /* AliyunPlayerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AliyunPlayerView.m; sourceTree = ""; }; 34 | B3E7B5881CC2AC0600A0062D /* RNAliyunPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNAliyunPlayer.h; sourceTree = ""; }; 35 | B3E7B5891CC2AC0600A0062D /* RNAliyunPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNAliyunPlayer.m; sourceTree = ""; }; 36 | B8A4716E20F44FBD00051544 /* AliyunPlayManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AliyunPlayManager.h; sourceTree = ""; }; 37 | B8A4716F20F44FBD00051544 /* AliyunPlayManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AliyunPlayManager.m; sourceTree = ""; }; 38 | B8A471CB20F4543400051544 /* AliThirdparty.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AliThirdparty.framework; sourceTree = ""; }; 39 | B8A471CC20F4543400051544 /* AliyunLanguageSource.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = AliyunLanguageSource.bundle; sourceTree = ""; }; 40 | B8A471CD20F4543400051544 /* AliyunVodPlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AliyunVodPlayerSDK.framework; sourceTree = ""; }; 41 | B8A471CE20F4543400051544 /* AliyunPlayerSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AliyunPlayerSDK.framework; sourceTree = ""; }; 42 | /* End PBXFileReference section */ 43 | 44 | /* Begin PBXFrameworksBuildPhase section */ 45 | 58B511D81A9E6C8500147676 /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | B8A471D020F4543400051544 /* AliyunVodPlayerSDK.framework in Frameworks */, 50 | B8A471CF20F4543400051544 /* AliThirdparty.framework in Frameworks */, 51 | B8A471D120F4543400051544 /* AliyunPlayerSDK.framework in Frameworks */, 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 134814211AA4EA7D00B7C361 /* Products */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 134814201AA4EA6300B7C361 /* libRNAliyunPlayer.a */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | 58B511D21A9E6C8500147676 = { 67 | isa = PBXGroup; 68 | children = ( 69 | 3490AF6A2104834A00147CC2 /* AliyunPlayerView.h */, 70 | 3490AF6B2104834B00147CC2 /* AliyunPlayerView.m */, 71 | B8A471CA20F4543400051544 /* libs */, 72 | B8A4716E20F44FBD00051544 /* AliyunPlayManager.h */, 73 | B8A4716F20F44FBD00051544 /* AliyunPlayManager.m */, 74 | B3E7B5881CC2AC0600A0062D /* RNAliyunPlayer.h */, 75 | B3E7B5891CC2AC0600A0062D /* RNAliyunPlayer.m */, 76 | 134814211AA4EA7D00B7C361 /* Products */, 77 | ); 78 | sourceTree = ""; 79 | }; 80 | B8A471CA20F4543400051544 /* libs */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | B8A471CB20F4543400051544 /* AliThirdparty.framework */, 84 | B8A471CC20F4543400051544 /* AliyunLanguageSource.bundle */, 85 | B8A471CD20F4543400051544 /* AliyunVodPlayerSDK.framework */, 86 | B8A471CE20F4543400051544 /* AliyunPlayerSDK.framework */, 87 | ); 88 | path = libs; 89 | sourceTree = ""; 90 | }; 91 | /* End PBXGroup section */ 92 | 93 | /* Begin PBXNativeTarget section */ 94 | 58B511DA1A9E6C8500147676 /* RNAliyunPlayer */ = { 95 | isa = PBXNativeTarget; 96 | buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNAliyunPlayer" */; 97 | buildPhases = ( 98 | 58B511D71A9E6C8500147676 /* Sources */, 99 | 58B511D81A9E6C8500147676 /* Frameworks */, 100 | 58B511D91A9E6C8500147676 /* CopyFiles */, 101 | ); 102 | buildRules = ( 103 | ); 104 | dependencies = ( 105 | ); 106 | name = RNAliyunPlayer; 107 | productName = RCTDataManager; 108 | productReference = 134814201AA4EA6300B7C361 /* libRNAliyunPlayer.a */; 109 | productType = "com.apple.product-type.library.static"; 110 | }; 111 | /* End PBXNativeTarget section */ 112 | 113 | /* Begin PBXProject section */ 114 | 58B511D31A9E6C8500147676 /* Project object */ = { 115 | isa = PBXProject; 116 | attributes = { 117 | LastUpgradeCheck = 0830; 118 | ORGANIZATIONNAME = Facebook; 119 | TargetAttributes = { 120 | 58B511DA1A9E6C8500147676 = { 121 | CreatedOnToolsVersion = 6.1.1; 122 | }; 123 | }; 124 | }; 125 | buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNAliyunPlayer" */; 126 | compatibilityVersion = "Xcode 3.2"; 127 | developmentRegion = English; 128 | hasScannedForEncodings = 0; 129 | knownRegions = ( 130 | en, 131 | ); 132 | mainGroup = 58B511D21A9E6C8500147676; 133 | productRefGroup = 58B511D21A9E6C8500147676; 134 | projectDirPath = ""; 135 | projectRoot = ""; 136 | targets = ( 137 | 58B511DA1A9E6C8500147676 /* RNAliyunPlayer */, 138 | ); 139 | }; 140 | /* End PBXProject section */ 141 | 142 | /* Begin PBXSourcesBuildPhase section */ 143 | 58B511D71A9E6C8500147676 /* Sources */ = { 144 | isa = PBXSourcesBuildPhase; 145 | buildActionMask = 2147483647; 146 | files = ( 147 | 3490AF6C2104834B00147CC2 /* AliyunPlayerView.m in Sources */, 148 | B3E7B58A1CC2AC0600A0062D /* RNAliyunPlayer.m in Sources */, 149 | B8A4717020F44FBD00051544 /* AliyunPlayManager.m in Sources */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXSourcesBuildPhase section */ 154 | 155 | /* Begin XCBuildConfiguration section */ 156 | 58B511ED1A9E6C8500147676 /* Debug */ = { 157 | isa = XCBuildConfiguration; 158 | buildSettings = { 159 | ALWAYS_SEARCH_USER_PATHS = NO; 160 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 161 | CLANG_CXX_LIBRARY = "libc++"; 162 | CLANG_ENABLE_MODULES = YES; 163 | CLANG_ENABLE_OBJC_ARC = YES; 164 | CLANG_WARN_BOOL_CONVERSION = YES; 165 | CLANG_WARN_CONSTANT_CONVERSION = YES; 166 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 167 | CLANG_WARN_EMPTY_BODY = YES; 168 | CLANG_WARN_ENUM_CONVERSION = YES; 169 | CLANG_WARN_INFINITE_RECURSION = YES; 170 | CLANG_WARN_INT_CONVERSION = YES; 171 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 172 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 173 | CLANG_WARN_UNREACHABLE_CODE = YES; 174 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 175 | COPY_PHASE_STRIP = NO; 176 | ENABLE_STRICT_OBJC_MSGSEND = YES; 177 | ENABLE_TESTABILITY = YES; 178 | GCC_C_LANGUAGE_STANDARD = gnu99; 179 | GCC_DYNAMIC_NO_PIC = NO; 180 | GCC_NO_COMMON_BLOCKS = YES; 181 | GCC_OPTIMIZATION_LEVEL = 0; 182 | GCC_PREPROCESSOR_DEFINITIONS = ( 183 | "DEBUG=1", 184 | "$(inherited)", 185 | ); 186 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 187 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 188 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 189 | GCC_WARN_UNDECLARED_SELECTOR = YES; 190 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 191 | GCC_WARN_UNUSED_FUNCTION = YES; 192 | GCC_WARN_UNUSED_VARIABLE = YES; 193 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 194 | MTL_ENABLE_DEBUG_INFO = YES; 195 | ONLY_ACTIVE_ARCH = YES; 196 | SDKROOT = iphoneos; 197 | }; 198 | name = Debug; 199 | }; 200 | 58B511EE1A9E6C8500147676 /* Release */ = { 201 | isa = XCBuildConfiguration; 202 | buildSettings = { 203 | ALWAYS_SEARCH_USER_PATHS = NO; 204 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 205 | CLANG_CXX_LIBRARY = "libc++"; 206 | CLANG_ENABLE_MODULES = YES; 207 | CLANG_ENABLE_OBJC_ARC = YES; 208 | CLANG_WARN_BOOL_CONVERSION = YES; 209 | CLANG_WARN_CONSTANT_CONVERSION = YES; 210 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 211 | CLANG_WARN_EMPTY_BODY = YES; 212 | CLANG_WARN_ENUM_CONVERSION = YES; 213 | CLANG_WARN_INFINITE_RECURSION = YES; 214 | CLANG_WARN_INT_CONVERSION = YES; 215 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 216 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 217 | CLANG_WARN_UNREACHABLE_CODE = YES; 218 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 219 | COPY_PHASE_STRIP = YES; 220 | ENABLE_NS_ASSERTIONS = NO; 221 | ENABLE_STRICT_OBJC_MSGSEND = YES; 222 | GCC_C_LANGUAGE_STANDARD = gnu99; 223 | GCC_NO_COMMON_BLOCKS = YES; 224 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 225 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 226 | GCC_WARN_UNDECLARED_SELECTOR = YES; 227 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 228 | GCC_WARN_UNUSED_FUNCTION = YES; 229 | GCC_WARN_UNUSED_VARIABLE = YES; 230 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 231 | MTL_ENABLE_DEBUG_INFO = NO; 232 | SDKROOT = iphoneos; 233 | VALIDATE_PRODUCT = YES; 234 | }; 235 | name = Release; 236 | }; 237 | 58B511F01A9E6C8500147676 /* Debug */ = { 238 | isa = XCBuildConfiguration; 239 | buildSettings = { 240 | FRAMEWORK_SEARCH_PATHS = ( 241 | "$(inherited)", 242 | "$(PROJECT_DIR)/libs", 243 | ); 244 | HEADER_SEARCH_PATHS = ( 245 | "$(inherited)", 246 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 247 | "$(SRCROOT)/../../../React/**", 248 | "$(SRCROOT)/../../react-native/React/**", 249 | ); 250 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 251 | OTHER_LDFLAGS = "-ObjC"; 252 | PRODUCT_NAME = RNAliyunPlayer; 253 | SKIP_INSTALL = YES; 254 | }; 255 | name = Debug; 256 | }; 257 | 58B511F11A9E6C8500147676 /* Release */ = { 258 | isa = XCBuildConfiguration; 259 | buildSettings = { 260 | FRAMEWORK_SEARCH_PATHS = ( 261 | "$(inherited)", 262 | "$(PROJECT_DIR)/libs", 263 | ); 264 | HEADER_SEARCH_PATHS = ( 265 | "$(inherited)", 266 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 267 | "$(SRCROOT)/../../../React/**", 268 | "$(SRCROOT)/../../react-native/React/**", 269 | ); 270 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 271 | OTHER_LDFLAGS = "-ObjC"; 272 | PRODUCT_NAME = RNAliyunPlayer; 273 | SKIP_INSTALL = YES; 274 | }; 275 | name = Release; 276 | }; 277 | /* End XCBuildConfiguration section */ 278 | 279 | /* Begin XCConfigurationList section */ 280 | 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNAliyunPlayer" */ = { 281 | isa = XCConfigurationList; 282 | buildConfigurations = ( 283 | 58B511ED1A9E6C8500147676 /* Debug */, 284 | 58B511EE1A9E6C8500147676 /* Release */, 285 | ); 286 | defaultConfigurationIsVisible = 0; 287 | defaultConfigurationName = Release; 288 | }; 289 | 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNAliyunPlayer" */ = { 290 | isa = XCConfigurationList; 291 | buildConfigurations = ( 292 | 58B511F01A9E6C8500147676 /* Debug */, 293 | 58B511F11A9E6C8500147676 /* Release */, 294 | ); 295 | defaultConfigurationIsVisible = 0; 296 | defaultConfigurationName = Release; 297 | }; 298 | /* End XCConfigurationList section */ 299 | }; 300 | rootObject = 58B511D31A9E6C8500147676 /* Project object */; 301 | } 302 | -------------------------------------------------------------------------------- /ios/RNAliyunPlayer.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | 3 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/libs/AliThirdparty.framework/AliThirdparty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliThirdparty.framework/AliThirdparty -------------------------------------------------------------------------------- /ios/libs/AliThirdparty.framework/Headers/AliThirdparty.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliThirdparty.h 3 | // AliThirdparty 4 | // 5 | // Created by shiping.csp on 2018/3/19. 6 | // Copyright © 2018年 shiping.csp. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for AliThirdparty. 12 | FOUNDATION_EXPORT double AliThirdpartyVersionNumber; 13 | 14 | //! Project version string for AliThirdparty. 15 | FOUNDATION_EXPORT const unsigned char AliThirdpartyVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /ios/libs/AliThirdparty.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliThirdparty.framework/Info.plist -------------------------------------------------------------------------------- /ios/libs/AliThirdparty.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AliThirdparty { 2 | umbrella header "AliThirdparty.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/libs/AliyunLanguageSource.bundle/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunLanguageSource.bundle/Info.plist -------------------------------------------------------------------------------- /ios/libs/AliyunLanguageSource.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunLanguageSource.bundle/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /ios/libs/AliyunLanguageSource.bundle/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunLanguageSource.bundle/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/AliyunPlayerSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunPlayerSDK.framework/AliyunPlayerSDK -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/AliVcMediaPlayer.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * 4 | * This framework uses FFmpeg source code. 5 | * 6 | * FFmpeg is free software; you can redistribute it and/or 7 | * modify it under the terms of the GNU Lesser General Public 8 | * License as published by the Free Software Foundation; either 9 | * version 2.1 of the License, or (at your option) any later version. 10 | * 11 | * FFmpeg is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 | * Lesser General Public License for more details. 15 | * 16 | */ 17 | 18 | 19 | #import 20 | #import 21 | #import "AliVcPlayerDefine.h" 22 | /** 23 | * iOS媒体播放器SDK是在iOS平台上使用的软件开发工具包(Software Developement Kit),为iOS开发者提供简单易用的接口,帮助开发者实现iOS平台上的媒体播放应用开发。该SDK对目前主流的视频格式都提供了良好的支持,支持本地和网络媒体的播放,弥补了系统播放器在媒体格式上的不足。 24 | 25 | * 该SDK有一下功能特点: 26 | 方便快捷、低门槛实现媒体播放功能。用户无须关心内部实现细节,只需要自定义界面既可以实现专业级的播放应用。 27 | 流媒体格式的完美支持,支持HLS、RTMP、HTTP等多种流媒体格式。 28 | */ 29 | @interface AliVcMediaPlayer : NSObject 30 | 31 | /** 32 | * 功能:创建播放器,并设置播放器显示窗口。播放器内部会新建各个播放器变量并初始化,并启动播放器内部流水线线程等。 33 | * 参数:UIView* view,播放器显示窗口 34 | * 备注:如果创建播放器的时候view没有,则可以传递nil,可以在后续需要设置view。 35 | */ 36 | - (AliVcMovieErrorCode) create: (UIView*)view; 37 | 38 | /** 39 | * 功能:播放器初始化视频文件,主要目的是分析视频文件内容,读取视频头信息,解析视频流中的视频和音频信息,并根据视频和音频信息去寻找解码器,创建播放线程等。 40 | * 返回值:当初始化视频文件成功,返回ALIVC_SUCCESS,否则返回失败,具体的逻辑如下: 41 | 1. 验证视频源dataSource是否为空,为空则返回ALIVC_ERR_NO_INPUTFILE。 42 | 2. 如果播放器是正在播放或者正在暂停状态,则不能够进行prepare,此时返回非法的播放流程错误ALIVC_ERR_ILLEGALSTATUS,如果播放器状态是已经是准备完成状态,则返回ALIVC_SUCCESS。 43 | 3. 对视频进行初始化,如果成功,则会发送LoadDidPreparedNotification通知,表示视频初始化完成。如果失败则会发送PlaybackErrorNotification通知,在错误通知中可以获取到错误代码。 44 | * 备注:调用该函数完成后立即返回,需要等待准备完成通知AliVcMediaPlayerLoadDidPreparedNotification,收到该通知后代表视频初始化完成,视频准备完成后可以获取到视频的相关信息如:duration、videoWidth、videoHeight。 45 | */ 46 | - (AliVcMovieErrorCode) prepareToPlay: (NSURL*)dataSource; 47 | 48 | 49 | 50 | /** 51 | *功能:播放加密视频 52 | *videoKey: 加密key 53 | *circleCount : 加密级别 54 | */ 55 | - (AliVcMovieErrorCode) prepareToPlay: (NSURL*)url AndvideoKey:(NSString *)videoKey AndcircleCount:(int)circleCount; 56 | 57 | 58 | /** 59 | * 功能:播放当前视频 60 | * 返回值:当播放视频成功,返回ALIVC_SUCCESS,否则返回失败,具体见下述逻辑: 61 | 1. 如果播放器是停止的状态,则直接返回ALIVC_ERR_ILLEGALSTATUS错误,如果此时播放器为播放的状态,直接返回ALIVC_SUCCESS。 62 | 2. 如果播放器在暂停或者准备完成的状态,则直接启动视频播放。 63 | * 备注:播放器调用play进行播放,必须在播放器状态为准备完成的状态或者暂停的状态才能进行播放,其他情况都不能够将视频播放起来。 64 | */ 65 | - (AliVcMovieErrorCode) play; 66 | 67 | /** 68 | * 功能:停止当前视频播放,调用此函数则是结束视频播放,视频显示为黑屏,并回到视频播放起始点。 69 | * 返回值:停止视频播放成功ALIVC_SUCCESS。否则返回失败。具体逻辑如下: 70 | 1. 如果此时播放器的状态为停止状态,直接返回ALIVC_SUCCESS。 71 | 2. 其他情况则停止视频播放,并将播放器状态设置为Stopped,视频停止后会发送视频结束通知AliVcMediaPlayerPlaybackStopNotification。 72 | * 备注:该函数会停止掉内部音视频解码线程,如果需要重新进行播放,则需要再调用prepareToPlay进行重新对视频进行初始化。 73 | */ 74 | - (AliVcMovieErrorCode) stop; 75 | 76 | /** 77 | * 功能:暂停当前视频播放 78 | * 返回值:暂停视频播放成功ALIVC_SUCCESS。否则返回失败。具体逻辑如下: 79 | 1. 如果此时播放器的状态为暂停状态,直接返回ALIVC_SUCCESS。 80 | 2. 如果播放器状态为停止或者准备完成状态则返回错误的播放器状态ALIVC_ERR_ILLEGALSTATUS。 81 | 3. 其他情况则暂停视频播放,并将播放器状态设置为暂停状态。 82 | 83 | * 备注:播放器调用pause暂停视频播放,一般是在视频播放的情况下调用此函数。 84 | */ 85 | - (AliVcMovieErrorCode) pause; 86 | 87 | 88 | /** 89 | * 功能:跳转视频到新的播放位置 90 | * 参数:newPos,单位为毫秒 91 | * 返回值:跳转成功ALIVC_SUCCESS。否则返回失败。具体逻辑如下: 92 | 1. 如果此时播放器的状态为停止或准备完成状态,返回错误的播放器状态ALIVC_ERR_ILLEGALSTATUS。 93 | 2. 其他情况则进行视频跳转,返回等待视频跳转结束通知AliVcMediaPlayerSeekingDidFinishNotification。 94 | * 备注:该函数为异步函数,调用此函数后并不会立即进行视频跳转,需要等待视频跳转结束通知。参数的范围为[0,duration],如果传入的参数小于0,则播放器内部会自动跳转到0,如果传入参数大于duration,则会跳转到duration最后位置。 95 | */ 96 | - (AliVcMovieErrorCode) seekTo: (NSTimeInterval) newPos; 97 | 98 | /** 99 | * 功能:重置播放器,其目的是将播放器所有状态恢复到最初位置,当播放器内部出现错误或其它问题时,调用此函数来进行恢复。 100 | * 返回值:如果权限验证通过,则会返回ALIVC_SUCCESS。 101 | * 备注:该函数和stop函数的区别是,reset也能够实现stop的功能,但是reset会去销毁播放器内部的各种变量,然后重新进行变量初始化,view变量等会被设置成空,如果需要播放,则需要重新设置view,并且调用create重新初始化播放器内部各个变量。 102 | */ 103 | - (AliVcMovieErrorCode) reset; 104 | 105 | /** 106 | * 功能:销毁播放器,该函数用来释放播放器内部的所有变量,退出所有线程。 107 | * 备注:在退出播放器的时候必须调用该函数,用来进行内存释放,否则会存在内存泄露。 108 | */ 109 | -(AliVcMovieErrorCode) destroy; 110 | 111 | /** 112 | * 功能:获取SDK中日志的一些属性,double值。 113 | * 返回值:返回double型日志属性。 114 | */ 115 | -(double) getPropertyDouble:(int)property defaultValue:(double)defaultValue; 116 | 117 | /** 118 | * 功能:获取SDK中日志的一些属性,int64值。 119 | * 返回值:返回int64型日志属性。 120 | */ 121 | -(int64_t) getPropertyLong:(int)property defaultValue:(int64_t)defaultValue; 122 | 123 | /** 124 | * 功能:获取SDK中日志的一些属性,字符值。 125 | * 返回值:返回字符型日志属性。 126 | */ 127 | -(NSString*) getPropertyString:(int)property defaultValue:(NSString*)defaultValue; 128 | 129 | 130 | /** 131 | * 功能:设置业务ID。 132 | * 返回值:无。 133 | * 备注:设置用户使用该SDK的业务ID,用于日志汇报和统计。 134 | */ 135 | - (void) setBussinessID:(NSString*)bussinessID; 136 | 137 | /** 138 | * 功能:设置用户ID。 139 | * 返回值:无。 140 | * 备注:设置用户使用该SDK的用户ID,用于日志汇报和统计。 141 | */ 142 | - (void) setUserID:(NSString*)userID; 143 | 144 | 145 | - (void) setTraceID:(NSString*)traceId; 146 | 147 | /** 148 | * 功能:是否正在播放 149 | */ 150 | - (BOOL)isPlaying; 151 | 152 | 153 | /** 154 | * 功能:包含视频内容的view。 155 | * 备注:需要在调用prepareToPlay之前设置view,当前view只有视频帧图像,没有相关控制组件,相当于iOS系统播放器MPMoviePlayerController的控制方式controlStyle为MPMovieControlStyleNone的效果。 156 | */ 157 | @property(nonatomic, retain) UIView *view; 158 | 159 | /** 160 | * 功能:获取当前视频播放位置,只读属性,获取单位为毫秒。 161 | * 备注:当播放器状态为正在播放或暂停的状态,能够获取到有效值,否则获取值为无效0。 162 | */ 163 | @property(nonatomic, readonly) NSTimeInterval currentPosition; 164 | 165 | /** 166 | * 功能:获取视频高度,只读属性。 167 | * 备注:当调用了prepareToPlay后,并不能立即获得videoHeight的值,只有当播放器发送了prepared通知后,videoHeight的值才有效,否则为默认值0。 168 | */ 169 | @property(nonatomic, readonly) int videoHeight; 170 | 171 | /** 172 | * 功能:获取视频宽度,只读属性。 173 | * 备注:当调用了prepareToPlay后,并不能立即获得videoWidth的值,只有当播放器发送了prepared通知后,videoWidth的值才有效,否则为默认值0。 174 | */ 175 | @property(nonatomic, readonly) int videoWidth; 176 | 177 | /** 178 | * 功能:设置是直播还是点播,1为直播,0为点播,默认为-1不进行设置 179 | * 备注:设置了是直播还是点播,不由播放器自动判定 180 | */ 181 | @property(nonatomic, readwrite) MediaType mediaType; 182 | 183 | /** 184 | * 功能:设置网络超时时间,单位毫秒 185 | * 备注:当播放网络流时,设置网络超时时间,默认15000毫秒 186 | */ 187 | @property(nonatomic, readwrite) int timeout; 188 | 189 | /** 190 | * 功能:当直播时,缓冲区数据大于dropBufferDuration时开始丢数据,单位毫秒,默认8000毫秒 191 | * 备注:必须大于一个GOP的长度。 192 | */ 193 | @property(nonatomic, readwrite) int dropBufferDuration; 194 | 195 | /** 196 | * 功能:获取视频时长,只读属性,单位为毫秒。 197 | * 备注:当调用了prepareToPlay后,并不能立即获得duration的值,只有当播放器发送了prepared通知后,duration的值才有效,否则为默认值0。 198 | */ 199 | @property(nonatomic, readonly) NSTimeInterval duration; 200 | 201 | /** 202 | * 功能:获取缓冲的时长,只读属性,单位为毫秒。 203 | * 备注:当调用了prepareToPlay后,并且开始播放后,才能获取该值。 204 | */ 205 | @property(nonatomic, readonly) NSTimeInterval bufferingPostion; 206 | 207 | /** 208 | * 功能:设置渲染的模式,适应全屏还是充满全屏 209 | * 备注:scalingModeApsectFill可能会存在crop的情况 210 | */ 211 | @property(nonatomic, readwrite) ScalingMode scalingMode; 212 | 213 | /** 214 | * 功能:设置是否静音,YES为静音 215 | */ 216 | @property(nonatomic, readwrite) BOOL muteMode; 217 | 218 | /** 219 | * 功能:设置stop或者播放结束后是否保留显示最后一帧,默认YES显示 220 | */ 221 | @property(nonatomic, readwrite) BOOL keepLastFrame; 222 | 223 | /** 224 | * 获取播放器错误代码(只读),错误代码的类型为: 225 | enum{ 226 | ALIVC_ERR_INVALID_PARAM = 4001, // 参数非法,请检查输入参数 227 | ALIVC_ERR_INVALID_INPUTFILE = 4003, // 无效的输入,请检查输入地址或者网络链接 228 | ALIVC_ERR_NO_INPUTFILE = 4004, // 没有设置视频源 229 | ALIVC_ERR_LOADING_TIMEOUT = 4008, // 视频加载超时,请检查网络状况 230 | ALIVC_ERR_VIDEO_FORMAT_UNSUPORTED = 4011, // 视频格式不支持 231 | ALIVC_ERR_NO_SUPPORT_CODEC = 4019, // 视频编码格式不支持 232 | ALIVC_ERR_ILLEGALSTATUS = 4021, // 非法的播放器状态,当前状态是xx 233 | ALIVC_ERR_NO_MEMORY = 4023, // 没有足够的内存 234 | }; 235 | */ 236 | @property(nonatomic, readonly) AliVcMovieErrorCode errorCode; 237 | 238 | 239 | /** 240 | * 功能:设置/获取音量接口 241 | * 备注:此接口操作的是系统的音量接口, 范围为0.0-1.0 242 | */ 243 | @property(nonatomic, readwrite) float volume; 244 | 245 | /** 246 | * 功能:设置/获取屏幕亮度接口 247 | * 备注:此接口操作的是系统的亮度接口, 范围为0.0-1.0 248 | */ 249 | @property(nonatomic, readwrite) float brightness; 250 | 251 | 252 | /** 253 | * 功能:设置倍数播放值 254 | * 备注:范围0~2:0.5倍(慢速播放)、1倍(正常播放)、1.5倍(加速播放)、2倍(加速播放) 255 | */ 256 | @property(nonatomic, readwrite) float playSpeed; 257 | 258 | /** 259 | * 功能:控制台是否打印日志 260 | * 备注:YES表示打印日志,NO表示不打印 261 | */ 262 | @property(nonatomic, readwrite) BOOL printLog; 263 | 264 | /** 265 | * 功能:循环播放控制 266 | */ 267 | @property(nonatomic, readwrite) BOOL circlePlay; 268 | 269 | /** 270 | * 功能:获取旋转角度 271 | */ 272 | @property(nonatomic, readonly) double videoRotation; 273 | 274 | /** 275 | * 功能:是否开启日志发送 276 | */ 277 | @property(nonatomic, assign) BOOL enableLogReport; 278 | 279 | /** 280 | * 功能:获取播放器调试信息。 281 | * 返回值:返回调试信息字典。 282 | * 备注:字典是NSNumber和NSString的字段。 283 | */ 284 | -(NSDictionary*)getAllDebugInfo; 285 | 286 | /** 287 | * 功能:获取SDK版本号。 288 | * 返回值:返回NSString类型的版本号。 289 | * 备注:当开发者反馈问题时,请使用该方法获得SDK版本号并随同问题一起反馈。 290 | */ 291 | - (NSString *) getSDKVersion; 292 | 293 | /** 294 | * 功能: 295 | * 参数:block:音频数据回调 296 | * 297 | */ 298 | -(void) getAudioData:(void (^)(NSData *data))block; 299 | 300 | /** 301 | * 功能: 302 | * 参数:设置渲染视图角度 303 | */ 304 | -(void) setRenderRotate:(RenderRotate)rotate; 305 | 306 | /** 307 | * 功能: 308 | * 参数:设置渲染镜像 309 | */ 310 | -(void) setRenderMirrorMode:(RenderMirrorMode)mirrorMode; 311 | 312 | /** 313 | * 功能:设置边播边缓存功能 314 | * 参数:bEnabled:是否开启缓存功能 315 | * saveDir:缓存存储的路径 316 | * maxSize:缓存路径最大空间 317 | * maxDuration:缓存最大视频最大长度 318 | */ 319 | -(void) setPlayingCache:(BOOL)bEnabled saveDir:(NSString*)saveDir maxSize:(int64_t)maxSize maxDuration:(int)maxDuration; 320 | 321 | /* 322 | * 设置referer 323 | */ 324 | - (void)setReferer:(NSString *)referer; 325 | 326 | /** 327 | * 功能:截取当前正在播放图像 328 | * 329 | */ 330 | -(UIImage*) snapshot; 331 | 332 | @end 333 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/AliVcPlayerDefine.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * 4 | * This framework uses FFmpeg source code. 5 | * 6 | * FFmpeg is free software; you can redistribute it and/or 7 | * modify it under the terms of the GNU Lesser General Public 8 | * License as published by the Free Software Foundation; either 9 | * version 2.1 of the License, or (at your option) any later version. 10 | * 11 | * FFmpeg is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 | * Lesser General Public License for more details. 15 | * 16 | */ 17 | 18 | 19 | #import 20 | #import 21 | #import "AliVcPlayerErrorCode.h" 22 | 23 | #define ALIVC_EXTERN extern __attribute__((visibility ("default"))) 24 | 25 | /** 26 | * 播放器通知定义 27 | 28 | * AliVcMediaPlayerLoadDidPreparedNotification:播放器初始化视频文件完成通知,调用prepareToPlay函数,会发送该通知,代表视频文件已经准备完成,此时可以在这个通知中获取到视频的相关信息,如视频分辨率,视频时长等。 29 | 30 | * AliVcMediaPlayerPlaybackDidFinishNotification:播放完成通知,当视频正常播放完成后会收此通知。 31 | 32 | * AliVcMediaPlayerPlaybackStopNotification:当前调用播放器Stop接口时会收到此通知。 33 | 34 | * AliVcMediaPlayerStartCachingNotification:播放器开始缓冲视频时发送该通知,当播放网络文件时,网络状态不佳或者调用seekTo时,此通知告诉用户网络下载数据已经开始缓冲。 35 | 36 | * AliVcMediaPlayerEndCachingNotification:播放器结束缓冲视频时发送该通知,当数据已经缓冲完,告诉用户已经缓冲结束,来更新相关UI显示。 37 | 38 | * AliVcMediaPlayerPlaybackErrorNotification:播放器播放失败发送该通知,并在该通知中可以获取到错误码。 39 | 40 | * AliVcMediaPlayerSeekingDidFinishNotification:播放器位置改变完成后发送该通知。 41 | 42 | * AliVcMediaPlayerFirstFrameNotification:播放器状态首帧显示后发送的通知。 43 | 44 | 播放器通知发送逻辑: 45 | 1. 调用prepareToPlay成功后发送AliVcMediaPlayerLoadDidPreparedNotification通知,失败则会发送AliVcMediaPlayerPlaybackErrorNotification。 46 | 2. 调用play、pause、stop、prepareToPlay、seekTo失败后发送AliVcMediaPlayerPlaybackErrorNotification通知。 47 | 3. 调用stop/reset成功后播放视频结束发送AliVcMediaPlayerPlaybackStopNotification通知 48 | 4. 播放器自动播放结束会发送AliVcMediaPlayerPlaybackDidFinishNotification通知。 49 | 5. 调用seekTo成功后发送AliVcMediaPlayerSeekingDidFinishNotification通知。 50 | 6. AliVcMediaPlayerStartCachingNotification和AliVcMediaPlayerEndCachingNotification通知,这个是在网络视频缓冲数据不足以够播放后会发送此通知,一般网络视频在调用seekTo后会发送此通知。 51 | 7. AliVcMediaPlayerCircleStartNotification通知,开启循环播放模式,进入循环播放开始时发送此通知。 52 | 8. 播放视频第一帧时发送此通知。 53 | 9. 开启循环播放功能,在进入循环播放时发送此通知。 54 | */ 55 | ALIVC_EXTERN NSString * const AliVcMediaPlayerLoadDidPreparedNotification; 56 | ALIVC_EXTERN NSString * const AliVcMediaPlayerPlaybackErrorNotification; 57 | ALIVC_EXTERN NSString * const AliVcMediaPlayerPlaybackStopNotification; 58 | ALIVC_EXTERN NSString * const AliVcMediaPlayerPlaybackDidFinishNotification; 59 | ALIVC_EXTERN NSString * const AliVcMediaPlayerSeekingDidFinishNotification; 60 | ALIVC_EXTERN NSString * const AliVcMediaPlayerStartCachingNotification; 61 | ALIVC_EXTERN NSString * const AliVcMediaPlayerEndCachingNotification; 62 | ALIVC_EXTERN NSString * const AliVcMediaPlayerFirstFrameNotification; 63 | ALIVC_EXTERN NSString * const AliVcMediaPlayerCircleStartNotification; 64 | ALIVC_EXTERN NSString * const AliVcMediaPlayerSeiDataNotification; 65 | 66 | /** 67 | * 播放器媒体类型 68 | * 播放器播放是直播还是点播类型枚举类型设置 69 | */ 70 | enum { 71 | MediaType_AUTO = -1, 72 | MediaType_VOD = 0, 73 | MediaType_LIVE = 1 74 | }; 75 | typedef NSInteger MediaType; 76 | 77 | 78 | /** 79 | * 适应全屏还是充满全屏 80 | * 备注:scalingModeApsectFill可能会存在crop的情况 81 | */ 82 | enum { 83 | scalingModeAspectFit = 0, 84 | scalingModeAspectFitWithCropping = 1, 85 | }; 86 | typedef NSInteger ScalingMode; 87 | 88 | /** 89 | * 渲染旋转角度设置 90 | */ 91 | enum { 92 | renderRotate0 = 0, 93 | renderRotate90 = 90, 94 | renderRotate180 = 180, 95 | renderRotate270 = 270, 96 | }; 97 | typedef NSInteger RenderRotate; 98 | 99 | /** 100 | * 渲染镜像设置 101 | */ 102 | enum { 103 | renderMirrorModeNone = 0, 104 | renderMirrorHorizonMode, 105 | renderMirrorVerticalMode, 106 | }; 107 | typedef NSInteger RenderMirrorMode; 108 | 109 | 110 | //调试信息的key指,用于接口getAllDebugInfo信息返回值的dictionary的key的值 111 | //视频解码帧率,double值 112 | #define FLT_VIDEO_DECODE_FPS @"dec-fps" 113 | 114 | //视频下载帧率,double值 115 | #define FLT_VIDEO_OUTPUT_FPS @"out-fps" 116 | 117 | //视频stream index值,int64值 118 | #define INT64_SELECT_VIDEO_STREAM @"select_v" 119 | 120 | //音频stream index值,int64值 121 | #define INT64_SELECT_AUDIO_STREAM @"select_a" 122 | 123 | //视频缓冲的长度,int64值 124 | #define INT64_VIDEO_CACHE_DURATION @"vcache-dur" 125 | 126 | //音频缓冲的长度,int64值 127 | #define INT64_AUDIO_CACHE_DURATION @"acache-dur" 128 | 129 | //视频缓冲的字节数,int64值 130 | #define INT64_VIDEO_CACHE_BYTES @"vcache-bytes" 131 | 132 | //音频缓冲的字节数,int64值 133 | #define INT64_AUDIO_CACHE_BYTES @"acache-bytes" 134 | 135 | //视频缓冲的packet个数,int64值 136 | #define INT64_VIDEO_CACHE_PACKETS @"vcache-pkts" 137 | 138 | //音频缓冲的packet个数,int64值 139 | #define INT64_AUDIO_CACHE_PACKETS @"acache-pkts" 140 | 141 | //视频首帧显示时间,double值 142 | #define FLT_1ST_VFRAME_SHOW @"1st-vframeshow" 143 | 144 | //视频首帧解码时间,double值 145 | #define FLT_1ST_VFRAME_DECODE @"1st-vdecode" 146 | 147 | //视频首帧渲染时间,int64值 148 | #define FLT_1ST_VFRAME_RENDER @"1st-vrender" 149 | 150 | //视频首次下载时间,int64值 151 | #define FLT_1ST_DOWNLOAD_TIME @"1st-download" 152 | 153 | //视频find stream info的时间 154 | #define FLT_FIND_STREAM_TIME @"find-stream" 155 | 156 | //视频open format 的时间 157 | #define FLT_OPEN_FORMAT_TIME @"open-format" 158 | 159 | //视频tcp dns解析的时间 160 | #define FLT_TCP_DNS_TIME @"tcp-dns-time" 161 | 162 | //视频tcp connect解析的时间 163 | #define FLT_TCP_CONNECT_TIME @"tcp-connect-time" 164 | 165 | //视频rtmp open解析的时间 166 | #define FLT_RTMP_OPEN_TIME @"rtmp-open-time" 167 | 168 | //视频http open解析的时间 169 | #define FLT_HTTP_OPEN_TIME @"http-open-time" 170 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/AliVcPlayerErrorCode.h: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * 4 | * This framework uses FFmpeg source code. 5 | * 6 | * FFmpeg is free software; you can redistribute it and/or 7 | * modify it under the terms of the GNU Lesser General Public 8 | * License as published by the Free Software Foundation; either 9 | * version 2.1 of the License, or (at your option) any later version. 10 | * 11 | * FFmpeg is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 | * Lesser General Public License for more details. 15 | * 16 | */ 17 | 18 | 19 | #import 20 | #import 21 | 22 | /** 23 | * 播放器错误代码 24 | */ 25 | 26 | enum{ 27 | ALIVC_SUCCESS = 0, //无错误 28 | ALIVC_ERR_INVALID_PARAM = 4001 , //参数非法,请检查输入参数 29 | ALIVC_ERR_AUTH_EXPIRED = 4002, //鉴权过期,请重新获取新的鉴权信息 30 | ALIVC_ERR_INVALID_INPUTFILE = 4003, //无效的输入文件,请检查视频源和路径 31 | ALIVC_ERR_NO_INPUTFILE = 4004, //没有设置视频源或视频地址不存在 32 | ALIVC_ERR_READ_DATA_FAILED = 4005, //读取视频源失败 33 | ALIVC_ERR_LOADING_TIMEOUT = 4008, //视频加载超时,请检查网络状况 34 | ALIVC_ERR_REQUEST_DATA_ERROR = 4009, //请求数据错误 35 | ALIVC_ERR_VIDEO_FORMAT_UNSUPORTED = 4011, //视频格式不支持 36 | ALIVC_ERR_PLAYAUTH_PARSE_FAILED = 4012, //playAuth解析失败 37 | ALIVC_ERR_DECODE_FAILED = 4013, //视频解码失败 38 | ALIVC_ERR_NO_SUPPORT_CODEC = 4019, //视频编码格式不支持 39 | ALIVC_ERR_UNKNOWN = 4400, //未知错误 40 | ALIVC_ERR_REQUEST_ERROR = 4500, //服务端请求错误 41 | ALIVC_ERR_DATA_ERROR = 4501, //服务器返回数据错误 42 | ALIVC_ERR_QEQUEST_SAAS_SERVER_ERROR = 4502, //请求saas服务器错误 43 | ALIVC_ERR_QEQUEST_MTS_SERVER_ERROR = 4503, //请求mts服务器错误 44 | ALIVC_ERR_SERVER_INVALID_PARAM = 4504, //服务器返回参数无效,请检查XX参数 45 | ALIVC_ERR_ILLEGALSTATUS = 4521, //非法的播放器状态,当前状态是xx 46 | ALIVC_ERR_NO_VIEW = 4022, //没有设置显示窗口,请先设置播放视图 47 | ALIVC_ERR_NO_MEMORY = 4023, //内存不足 48 | 49 | // ALIVC_ERR_FUNCTION_DENIED = 4024, //系统权限被拒绝或没有经过授权 50 | ALIVC_ERR_DOWNLOAD_NO_NETWORK = 4101, //视频下载时连接不到服务器 51 | ALIVC_ERR_DOWNLOAD_NETWORK_TIMEOUT = 4102, //视频下载时网络超时 52 | ALIVC_ERR_DOWNLOAD_QEQUEST_SAAS_SERVER_ERROR = 4103, //请求saas服务器错误 53 | ALIVC_ERR_DOWNLOAD_QEQUEST_MTS_SERVER_ERROR = 4104, //请求mts服务器错误 54 | ALIVC_ERR_DOWNLOAD_SERVER_INVALID_PARAM = 4105, //服务器返回参数无效,请检查XX参数 55 | ALIVC_ERR_DOWNLOAD_INVALID_INPUTFILE = 4106, //视频下载流无效或地址过期 56 | ALIVC_ERR_DOWNLOAD_NO_ENCRYPT_FILE = 4107, //未找到加密文件,请从控制台下载加密文件并集成 57 | ALIVC_ERR_DONWNLOAD_GET_KEY = 4108, //获取秘钥失败,请检查秘钥文件 58 | ALIVC_ERR_DOWNLOAD_INVALID_URL = 4109, //下载地址无效 59 | ALIVC_ERR_DONWLOAD_NO_SPACE = 4110, //磁盘空间不够 60 | ALIVC_ERR_DOWNLOAD_INVALID_SAVE_PATH = 4111, //视频文件保存路径不存在,请重新设置 61 | ALIVC_ERR_DOWNLOAD_NO_PERMISSION = 4112, //当前视频不可下载 62 | ALIVC_ERR_DOWNLOAD_MODE_CHANGED = 4113, //下载模式改变无法继续下载 63 | ALIVC_ERR_DOWNLOAD_ALREADY_ADDED = 4114, //当前视频已经添加到下载项,请避免重复添加 64 | ALIVC_ERR_DOWNLOAD_NO_MATCH = 4115, //未找到合适的下载项,请先添加 65 | }; 66 | 67 | typedef NSInteger AliVcMovieErrorCode; 68 | typedef NSInteger ALPlayerErrorCode; 69 | typedef NSInteger ALPlayerDownLoadErrorCode; 70 | 71 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/AliyunPlayerSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunPlayerSDK.h 3 | // AliyunPlayerSDK 4 | // 5 | // Created by shiping chen on 16/5/8. 6 | // Copyright © 2016年 Alibaba. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for AliyunPlayerSDK. 12 | FOUNDATION_EXPORT double AliyunPlayerSDKVersionNumber; 13 | 14 | //! Project version string for AliyunPlayerSDK. 15 | FOUNDATION_EXPORT const unsigned char AliyunPlayerSDKVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | 21 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/KernelMPlayer.h: -------------------------------------------------------------------------------- 1 | #ifndef __KERNEL_MPLAYER_H__ 2 | #define __KERNEL_MPLAYER_H__ 3 | 4 | #include "MPlayingHandler.h" 5 | 6 | //class kernelMPlayer 7 | class kernelMPlayer 8 | { 9 | public: 10 | kernelMPlayer(void *eagl_view, IMPlayerHandler* handler); 11 | ~kernelMPlayer(); 12 | 13 | #ifdef __ANDROID__ 14 | int setVideoSurface(void *nativeWindow); 15 | int releaseVideoSurface(); 16 | #endif 17 | 18 | #ifdef __ANDROID__ 19 | mp_status_t prepare(const char* url, int start_ms, int& decoder_type,const char* videoKey,int circleCount=10); //in ms. 20 | #else 21 | mp_status_t prepare(const char* url, int start_ms,const char* videoKey=NULL,int circleCount=10); //in ms. 22 | #endif 23 | 24 | void setSurfaceChanged(); 25 | 26 | //return ms 27 | int get_total_duration(); 28 | 29 | //return ms 30 | int get_current_position(); 31 | 32 | //return ms 33 | int get_buffering_position(); 34 | 35 | //return the video size: w and h. invoked after prepare. 36 | mp_status_t get_video_size(int& w, int& h); 37 | 38 | //set the buffering max time length. 39 | // before invoking start(). by default it is 100 sec. 40 | void setBufferingTimeLength(int max_ms); 41 | 42 | bool isPlaying(); 43 | 44 | bool isPaused(); 45 | 46 | //you need invoke prepare() before invoking the following functions. 47 | mp_status_t start(); 48 | mp_status_t stop(); 49 | mp_status_t pause(); 50 | 51 | //pause for buffering... 52 | mp_status_t pause_for_buffering(int buffering_time_ms); 53 | 54 | mp_status_t resume(); 55 | mp_status_t seekTo(int ms); 56 | 57 | bool notify(int what, int arg0, int arg1, void *custom_data); 58 | 59 | void setMuteMode(bool bmute); 60 | 61 | void setAudioDataCallback(audioDataCallback callback,void* userData); 62 | 63 | void setCirclePlay(bool bCirclePlay); 64 | private: 65 | void* m_player; 66 | }; 67 | 68 | 69 | 70 | #endif // __KERNEL_MPLAYER_H__ 71 | 72 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Headers/MPlayingHandler.h: -------------------------------------------------------------------------------- 1 | #ifndef __MPLAYING_HANDLER_H__ 2 | #define __MPLAYING_HANDLER_H__ 3 | 4 | typedef bool (*audioDataCallback)(char* pcmData,int dataSize,void* userData); 5 | 6 | //Function return error-code. 7 | typedef enum _mp_status_t{ 8 | E_MP_UNKNOW = -1, 9 | 10 | E_MP_OK, //successfully 11 | E_MP_NONE, //nothing could be play. empty file. 12 | E_MP_FAILED, //failed 13 | E_MP_UNSUPPORT, //Unsupport 14 | E_MP_INVALID_OPERATE, //function invoke order wrong probably 15 | 16 | E_MP_OUTOFMEM, //out of memory 17 | E_MP_INVALID_ARGS,//invalid argumets 18 | E_MP_CANCELED, 19 | } mp_status_t; 20 | 21 | class IMPlayerHandler{ 22 | public: 23 | virtual ~IMPlayerHandler(){}; 24 | public: 25 | 26 | //define what status 27 | enum { 28 | MSG_OPEN_STATUS = 0 29 | , MSG_LOAD_STATUS 30 | , MSG_PLAY_STATUS 31 | , MSG_PREPARE_STATUS 32 | , MSG_PLAY_PROGRESS //set the update-progress, arg0 is the progress, arg1 means it is audio or video 33 | 34 | , MSG_DECODE_STATUS 35 | , MSG_SIZE_STATUS 36 | , MSG_INFO_REPORT 37 | , MSG_FIRST_FRAME 38 | , MSG_PCM_DATA 39 | 40 | , MSG_CAPTURE_FRAME_DATA 41 | , MSG_SEI_DATA 42 | }; 43 | 44 | //info report type 45 | enum { 46 | INFOREPORT_EMPTY = 0 47 | ,INFOREPORT_OPEN_PLAY 48 | ,INFOREPORT_SEEK_START 49 | ,INFOREPORT_SEEK_END 50 | ,INFOREPORT_PAUSE_START 51 | 52 | ,INFOREPORT_PAUSE_END 53 | ,INFOREPORT_STOP 54 | ,INFOREPORT_BUFFERING_START 55 | ,INFOREPORT_BUFFERING_END 56 | ,INFOREPORT_EOS 57 | 58 | ,INFOREPORT_PLAYING_DOWN 59 | }; 60 | 61 | //define arg0 now. 62 | enum { 63 | 64 | k0Unknown = -1 65 | 66 | , k0None = 0 67 | , k0PrepareStart 68 | , k0PrepareFailed 69 | , k0Prepared //arg1 is total - duration //csp:OriginOnPreparedListener 70 | , k0OpenStart 71 | 72 | , k0OpenFailed 73 | , k0Opened 74 | , k0LoadStart // 75 | , k0LoadFailed 76 | , k0Loading //arg1 is the loading time in ms. 77 | 78 | , k0Loaded //arg1 is the loading time pts in ms. 79 | , k0PlayStarted 80 | , k0PlayPaused 81 | , k0PlayPausedForBuffering 82 | , k0PlayPausedForBufferingDone 83 | 84 | , k0PlayResumed 85 | , k0PlayStopped 86 | , k0PlaySeekDone // when seek handle get done and video played. arg0 is the progress value in ms. //csp:OriginSeekCompleteListener 87 | , k0PlayEnd //csp:OriginOnCompleteListener 88 | , k0DecodeDone //decode done. arg1 indeicate if it is audio or video 89 | 90 | , k0LoadingStart 91 | , k0LoadingEnd 92 | , k0LoadingProgress // arg1 is the progress 93 | , k0LoadingTimeout 94 | , k0AudioDecoding 95 | 96 | , k0CircleStart 97 | 98 | }; 99 | 100 | //define arg1 101 | enum{ 102 | k1Unknow = -1,//csp:OriginOnErrorListener 103 | 104 | k1None = 0, 105 | k1NetworkError,//csp:OriginOnErrorListener 106 | k1FileOpenError,//csp:OriginOnErrorListener 107 | k1FileDemuxError,//csp:OriginOnErrorListener 108 | k1InvalidFile,//csp:OriginOnErrorListener 109 | 110 | k1AudioPlayed, 111 | k1VideoPlayed, 112 | k1NoInputFile, 113 | k1NoMemory, 114 | k1NoSupportCodec, 115 | 116 | k1NoVideo, 117 | k1NetworkTimeout, 118 | k1InvalidPswd, 119 | k1AudioDecodeFail, 120 | }; 121 | 122 | //== 123 | virtual bool onStatus(int what, int arg0, int arg1, void* custom_data) = 0; 124 | 125 | public: 126 | int mPlayerId; 127 | }; 128 | 129 | 130 | 131 | #endif // __MPLAYING_HANDLER_H__ 132 | 133 | -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunPlayerSDK.framework/Info.plist -------------------------------------------------------------------------------- /ios/libs/AliyunPlayerSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AliyunPlayerSDK { 2 | umbrella header "AliyunPlayerSDK.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/AliyunVodPlayerSDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunVodPlayerSDK.framework/AliyunVodPlayerSDK -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Headers/AliyunVodDownLoadManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunVodeDownLoadManager.h 3 | // AliyunVodPlayerSDK 4 | // 5 | // Created by 王凯 on 2017/6/13. 6 | // Copyright © 2017年 SMY. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AliyunVodPlayerDefine.h" 11 | 12 | @interface AliyunDownloadMediaInfo : NSObject 13 | @property(nonatomic,copy)NSString *vid; 14 | @property(nonatomic,copy)NSString *title; 15 | @property(nonatomic,copy)NSString *coverURL; 16 | @property(nonatomic,assign)AliyunVodPlayerVideoQuality quality; 17 | @property(nonatomic,copy)NSString* videoDefinition; 18 | @property(nonatomic,assign)int downloadProgress; 19 | @property(nonatomic,copy)NSString *downloadFilePath; 20 | @property(nonatomic,copy)NSString *downloadFileName; 21 | @property(nonatomic,assign)int64_t duration; 22 | @property(nonatomic,assign)int64_t size; 23 | @property(nonatomic,copy)NSString* format; 24 | @end 25 | 26 | 27 | @interface AliyunStsData :NSObject 28 | @property(nonatomic,copy)NSString *accessKeyId; 29 | @property(nonatomic,copy)NSString *accessKeySecret; 30 | @property(nonatomic,copy)NSString *securityToken; 31 | 32 | @end 33 | 34 | @interface AliyunMtsData :NSObject 35 | @property(nonatomic,copy)NSString *accessKeyId; 36 | @property(nonatomic,copy)NSString *accessKeySecret; 37 | @property(nonatomic,copy)NSString *securityToken; 38 | @property(nonatomic,copy)NSString *authInfo; 39 | @property(nonatomic,copy)NSString *region; 40 | @property(nonatomic,copy)NSString *playDomain; 41 | @property(nonatomic,copy)NSString *mtsHlsUriToken; 42 | @end 43 | 44 | @interface AliyunDataSource : NSObject 45 | @property (nonatomic,assign)AliyunVodRequestMethod requestMethod; 46 | @property(nonatomic,copy)NSString *vid; 47 | @property(nonatomic,copy)NSString *playAuth; 48 | @property(nonatomic,assign)AliyunVodPlayerVideoQuality quality; 49 | @property(nonatomic,copy)NSString* videoDefinition; 50 | @property(nonatomic,copy)NSString *format; 51 | 52 | @property(nonatomic,strong)AliyunStsData *stsData; 53 | 54 | @property(nonatomic,strong)AliyunMtsData *mtsData; 55 | 56 | @end 57 | 58 | @class AliyunVodDownLoadManager; 59 | 60 | @protocol AliyunVodDownLoadDelegate 61 | 62 | @required 63 | /* 64 | 功能:准备下载回调。 65 | 回调数据:AliyunDownloadMediaInfo数组 66 | */ 67 | -(void) onPrepare:(NSArray*)mediaInfos; 68 | 69 | /* 70 | 功能:下载开始回调。 71 | 回调数据:AliyunDownloadMediaInfo 72 | */ 73 | -(void) onStart:(AliyunDownloadMediaInfo*)mediaInfo; 74 | 75 | /* 76 |  功能:调用stop结束下载时回调。 77 |  回调数据:AliyunDownloadMediaInfo 78 |  */ 79 | -(void) onStop:(AliyunDownloadMediaInfo*)mediaInfo; 80 | 81 | /* 82 |  功能:下载完成回调。 83 |  回调数据:AliyunDownloadMediaInfo 84 |  */ 85 | -(void) onCompletion:(AliyunDownloadMediaInfo*)mediaInfo; 86 | 87 | /* 88 |  功能:下载进度回调。可通过mediaInfo.downloadProgress获取进度。 89 |  回调数据:AliyunDownloadMediaInfo 90 |  */ 91 | -(void) onProgress:(AliyunDownloadMediaInfo*)mediaInfo; 92 | 93 | /* 94 |  功能:错误回调。错误码与错误信息详见文档。 95 |  回调数据:AliyunDownloadMediaInfo, code:错误码 msg:错误信息 96 |  */ 97 | -(void)onError:(AliyunDownloadMediaInfo*)mediaInfo code:(int)code msg:(NSString *)msg; 98 | 99 | 100 | @optional 101 | 102 | /* 103 |  功能:改变加密文件(调用changeEncryptFile时回调)。 104 |  回调数据:重新加密之前视频文件进度 105 |  */ 106 | -(void) onChangeEncryptFileProgress:(int)progress; 107 | 108 | 109 | /* 110 |  功能:改变加密文件后老的加密视频重新加密完成时回调。加密完成后注意删除老的加密文件。 111 |  */ 112 | -(void) onChangeEncryptFileComplete; 113 | 114 | /* 115 | 功能:未完成回调,异常中断导致下载未完成,下次启动后会接收到此回调。 116 | 回调数据:AliyunDownloadMediaInfo数组 117 | */ 118 | -(void) onUnFinished:(NSArray*)mediaInfos; 119 | 120 | /* 121 |  功能:开始下载后收到回调,更新最新的playAuth。主要场景是开始多个下载时,等待下载的任务自动开始下载后,playAuth有可能已经过期了,需通过此回调更新 122 | 参数:返回当前数据 123 | 返回:使用代理方法,设置playauth来更新数据。 124 | 备注:如通过请求数据来获取playAuth,请使用同步方法。此代理方法在其他线程里,不会存在卡线程问题。 125 |  */ 126 | -(NSString*)onGetPlayAuth:(NSString*)vid format:(NSString*)format quality:(AliyunVodPlayerVideoQuality)quality; 127 | 128 | 129 | /* 130 |  功能:开始下载后收到回调,更新最新的stsData。主要场景是开始多个下载时,等待下载的任务自动开始下载后,stsData有可能已经过期了,需通过此回调更新 131 | 参数:返回当前数据 132 | 返回:使用代理方法,设置AliyunStsData来更新数据。 133 | 备注:如通过请求数据来获取stsData,请使用同步方法。此代理方法在其他线程里,不会存在卡线程问题。 134 | */ 135 | - (AliyunStsData*)onGetAliyunStsData:(NSString *)videoID 136 | format:(NSString*)format 137 | quality:(AliyunVodPlayerVideoQuality)quality; 138 | 139 | /* 140 |  功能:开始下载后收到回调,更新最新的MtsData。主要场景是开始多个下载时,等待下载的任务自动开始下载后,MtsData有可能已经过期了,需通过此回调更新 141 | 参数:返回当前数据 142 | 返回:使用代理方法,设置AliyunMtsData来更新数据。 143 | 备注:如通过请求数据来获取mtsData,请使用同步方法。此代理方法在其他线程里,不会存在卡线程问题。 144 | */ 145 | - (AliyunMtsData*)onGetAliyunMtsData:(NSString *)videoID 146 | format:(NSString*)format 147 | quality:(NSString *)quality; 148 | 149 | 150 | 151 | @end 152 | 153 | 154 | @interface AliyunVodDownLoadManager : NSObject 155 | 156 | @property(nonatomic,weak)iddownloadDelegate; 157 | 158 | //log打印 159 | @property(nonatomic, assign) BOOL printLog; 160 | 161 | /* 162 | 功能:获取下载器 163 | 备注:单例 164 | */ 165 | +(AliyunVodDownLoadManager*)shareManager; 166 | 167 | /* 168 | 功能:配置下载路径 169 | 参数:dir 下载的目标目录。如果不存在,将自动创建。 170 | */ 171 | -(void)setDownLoadPath:(NSString *)path; 172 | 173 | /* 174 | 功能:设置同时下载的数量,最大4个 175 | 参数:count:同时下载的个数 176 | */ 177 | -(void)setMaxDownloadOperationCount:(int)count; 178 | 179 | /* 180 |  功能:设置加密文件 181 |  参数:encrptyFile为加密文件路径 182 |  */ 183 | -(void)setEncrptyFile:(NSString*)encrptyFile; 184 | 185 | 186 | /* 187 |  功能:改变加密文件,主要场景是新版本要升级加密文件,对于老版本已经下载的加密视频文件需要重新加密才能播放。 188 |  参数:oldEncrptyFile,老的加密文件 189 |  参数:newEncryptFile,新的加密文件 190 |  参数:mp4Files,需要转换的文件列表 191 |  */ 192 | -(int)changeEncryptFile:(NSString*)oldEncrptyFile newEncryptFile:(NSString*)newEncryptFile mp4Files:(NSArray*)mp4Files; 193 | 194 | /* 195 | 功能:设置下载进度监听器。 196 | 参数:listener 下载进度监听器。具体见下表。 197 | */ 198 | -(void)downLoadInfoListenerDelegate:(id)delegate; 199 | 200 | /* 201 | 功能:调用此方法来获取下载媒体信息,OnPrepare回调来获取 202 | 参数:dataSource 视频信息源。 203 | */ 204 | -(void)prepareDownloadMedia:(AliyunDataSource*)dataSource; 205 | 206 | /* 207 | 功能:开始下载单个视频资源。调用此方法后,开始下载视频。 208 | 参数:dataSource 视频信息源。 209 | */ 210 | -(void) startDownloadMedia:(AliyunDataSource*)dataSource; 211 | 212 | /* 213 | 功能:开始下载视频资源列表。调用此方法后,会依次下载列表中的视频。 214 | 参数:dataSources 视频信息源列表。 215 | */ 216 | -(void) startDownloadMedias:(NSArray*)dataSources; 217 | 218 | /* 219 | 功能:结束下载视频资源。 220 | 参数:downloadInfo 视频信息项。 221 | */ 222 | -(void) stopDownloadMedia:(AliyunDownloadMediaInfo*)downloadInfo; 223 | 224 | /* 225 | 功能:停止所有下载视频资源。 226 | */ 227 | -(void) stopAllDownloadMedia; 228 | 229 | /* 230 | 功能:结束下载视频资源列表。 231 | 参数:downloadInfos 视频信息项列表。 232 | */ 233 | -(void) stopDownloadMedias:(NSArray*)downloadInfos; 234 | 235 | /* 236 | 功能:获取正在下载视频资源列表,包括等待下载列表。 237 | 参数:downloadInfos 视频信息项列表。 238 | */ 239 | -(NSArray*) downloadingdMedias; 240 | 241 | /* 242 | 功能:获取正在下载视频资源列表。 243 | 参数:downloadInfos 视频信息项列表。 244 | */ 245 | -(NSArray*) currentDownloadingdMedias; 246 | 247 | 248 | /* 249 | 功能:获取所有的视频资源列表,包括停止的,正在下载的。 250 | 参数:downloadInfos 视频信息项列表。 251 | */ 252 | -(NSArray*) allMedias; 253 | 254 | /* 255 | 功能:清除所有下载的媒体资源。 256 | */ 257 | -(void) clearAllMedias; 258 | 259 | /* 260 | 功能:清除指定下载的媒体资源。 261 | */ 262 | -(void) clearMedia:(AliyunDownloadMediaInfo*)downloadInfo; 263 | 264 | /* 265 | 功能:获取下载功能的SDK版本号。 266 | */ 267 | - (NSString*) getSDKVersion; 268 | 269 | @end 270 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Headers/AliyunVodPlayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunVodPlayerManager.h 3 | // AliyunVodPlayerSDK 4 | // 5 | // Created by 王凯 on 2017/8/4. 6 | // Copyright © 2017年 SMY. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import "AliyunVodPlayerVideo.h" 13 | #import "AliyunVodPlayerDefine.h" 14 | #import 15 | 16 | @class AliyunVodPlayer; 17 | 18 | /** 19 | * 功能:播放事件协议方法 20 | */ 21 | @protocol AliyunVodPlayerDelegate 22 | 23 | @required 24 | /** 25 | * 功能:播放事件协议方法,主要内容 AliyunVodPlayerEventPrepareDone状态下,此时获取到播放视频数据(时长、当前播放数据、视频宽高等) 26 | * 参数:event 视频事件 27 | */ 28 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer onEventCallback:(AliyunVodPlayerEvent)event ; 29 | 30 | /** 31 | * 功能:播放器播放时发生错误时,回调信息 32 | * 参数:errorModel 播放器报错时提供的错误信息对象 33 | */ 34 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer playBackErrorModel:(AliyunPlayerVideoErrorModel *)errorModel; 35 | 36 | @optional 37 | 38 | /** 39 | * 功能:播放器播放即将切换清晰度时 40 | * 参数:quality : vid+playauth播放方式、vid+sts播放方式时的清晰度 41 | videoDefinition : 媒体转码播放方式的清晰度 42 | */ 43 | - (void)vodPlayer:(AliyunVodPlayer*)vodPlayer willSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition; 44 | 45 | /** 46 | * 功能:播放器播放切换清晰度完成 47 | * 参数:quality : vid+playauth播放方式、vid+sts播放方式时的清晰度 48 | videoDefinition : 媒体转码播放方式的清晰度 49 | */ 50 | - (void)vodPlayer:(AliyunVodPlayer *)vodPlayer didSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition; 51 | 52 | /** 53 | * 功能:播放器播放切换清晰度失败 54 | * 参数:quality : vid+playauth播放方式、vid+sts播放方式时的清晰度 55 | videoDefinition : 媒体转码播放方式的清晰度 56 | */ 57 | - (void)vodPlayer:(AliyunVodPlayer*)vodPlayer failSwitchToQuality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition; 58 | 59 | /** 60 | * 功能:1.播放器设置了循环播放,此代理方法才会有效。2.播放器播放完成后,开始循环播放后,此协议被调用 61 | */ 62 | - (void)onCircleStartWithVodPlayer:(AliyunVodPlayer*)vodPlayer; 63 | 64 | /* 65 | *功能:播放器请求时,通知用户传入的参数鉴权过期。 66 | */ 67 | - (void)onTimeExpiredErrorWithVodPlayer:(AliyunVodPlayer *)vodPlayer; 68 | 69 | /* 70 | *功能:播放地址将要过期时,提示用户当前播放地址过期。 (策略:当前播放器地址过期时间2小时,我们在播放地址差1分钟过期时提供回调;(7200-60)秒时发送) 71 | *参数:videoid:将过期时播放的videoId 72 | *参数:quality:将过期时播放的清晰度,playauth播放方式和STS播放方式有效。 73 | *参数:videoDefinition:将过期时播放的清晰度,MPS播放方式时有效。 74 | */ 75 | - (void)vodPlayerPlaybackAddressExpiredWithVideoId:(NSString *)videoId quality:(AliyunVodPlayerVideoQuality)quality videoDefinition:(NSString*)videoDefinition; 76 | 77 | 78 | @end 79 | 80 | /** 81 | * ALPlayerManager为播放器管理类,实现播放器的各种控制 82 | */ 83 | @interface AliyunVodPlayer : NSObject 84 | 85 | /* 86 | *功能:防盗链参数 87 | */ 88 | @property (nonatomic, copy) NSString *referer; 89 | 90 | /* 91 | *功能:临时AccessKeyId、AccessKeySecret和SecurityToken:开启RAM授权,并通过STS授权系统提供的OpenAPI或SDK获取的AccessKeyId、AccessKeySecret和SecurityToken,用于播放和下载请求 92 | *备注:参数明细->https://help.aliyun.com/document_detail/28788.html?spm=5176.doc28787.6.706.2G5SLS 93 | *版本:3.2.0版本使用 94 | */ 95 | - (void)prepareWithVid:(NSString *)vid 96 | accessKeyId:(NSString *)accessKeyId 97 | accessKeySecret:(NSString *)accessKeySecret 98 | securityToken:(NSString *)securityToken; 99 | 100 | 101 | 102 | /* 103 | *功能:使用vid+playauth方式播放。 104 | *参数:vid 视频id 105 | 106 | *playauth获取方法:https://help.aliyun.com/document_detail/52881.html?spm=5176.doc52879.6.650.aQZsBR 107 | 108 | 客户端开发也可以通过python脚本获取播放凭证进行调试,具体流程如下: 109 | 安装python2.7+pip环境(Mac环境下自带,Windows环境自行安装) 110 | 使用终端安装SDK,运行以下命令: 111 | pip install aliyun-python-sdk-core 112 | pip install aliyun-python-sdk-vod 113 | 下载Python脚本,从阿里云控制台获取accessKeyId和accessKeySecret并替换脚本里面的字段内容,从点播控制台获取已经上传视频的videoID并替换脚本里面的字段内容。 114 | 在python脚本所在目录下通过终端执行以下命令: 115 | python playAuth.py 116 | 在终端中查看获取的PlayAuth和VideoId。 117 | 在播放器SDK中使用获取的PlayAuth和VideoId进行播放,注意PlayAuth的时效为100秒,如果过期请重新获取。 118 | 119 | */ 120 | - (void)prepareWithVid:(NSString *)vid 121 | playAuth:(NSString *)playAuth; 122 | 123 | /* 124 | *功能:视频转码服务用户使用播放方式 125 | *参数:部分参数参考:https://help.aliyun.com/document_detail/53522.html?spm=5176.doc53534.2.5.mhSfOh 126 | HLS标准加密:https://help.aliyun.com/document_detail/59885.html?spm=5176.product29194.6.607.2bynDX 127 | *备注: 128 | */ 129 | - (void)prepareWithVid:(NSString*)vid 130 | accId:(NSString *)accId 131 | accSecret:(NSString*)accSecret 132 | stsToken:(NSString*)stsToken 133 | authInfo:(NSString*)authInfo 134 | region:(NSString*)region 135 | playDomain:(NSString*)playDomain 136 | mtsHlsUriToken:(NSString*)mtsHlsUriToken; 137 | 138 | /* 139 | *功能:播放器初始化视频,主要目的是分析视频内容,读取视频头信息,解析视频流中的视频和音频信息,并根据视频和音频信息去寻找解码器,创建播放线程等 140 | *参数:url,输入的url,包括本地地址和网络视频地址 141 | *备注:调用该函数完成后立即返回,需要等待准备完成通知,收到该通知后代表视频初始化完成,视频准备完成后可以获取到视频的相关信息。 142 | 使用本地地址播放,注意用户需要传 NSURL 类型数据,不是NSSting 类型数据。 143 | */ 144 | - (void)prepareWithURL:(NSURL *)url; 145 | 146 | /* 147 | 功能:获取播放器当前播放状态 148 | 当前播放状态有: 149 | AliyunVodPlayerStateIdle = 0, //空转,闲时,静态 150 | AliyunVodPlayerStateError, //错误 151 | AliyunVodPlayerStatePrepared, //已准备好 152 | AliyunVodPlayerStatePlay, //播放 153 | AliyunVodPlayerStatePause, //暂停 154 | AliyunVodPlayerStateStop, //停止 155 | AliyunVodPlayerStateFinish, //播放完成 156 | AliyunVodPlayerStateLoading //加载中 157 | */ 158 | - (AliyunVodPlayerState)playerState; 159 | 160 | 161 | /* 162 | 功能:开始播放视频 163 | 备注:在prepareWithVid之后可以调用start进行播放。 164 | */ 165 | - (void)start; 166 | 167 | /* 168 | 功能:恢复播放视频 169 | 备注:在pause暂停视频之后可以调用resume进行播放。 170 | */ 171 | - (void)resume; 172 | 173 | /* 174 | 功能:暂停播放视频 175 | 备注:在start播放视频之后可以调用pause进行暂停。 176 | */ 177 | - (void)pause; 178 | 179 | /* 180 | 功能:停止播放视频 181 | */ 182 | - (void)stop; 183 | 184 | /** 185 | * 功能:重置播放器,其目的是将播放器所有状态恢复到最初位置,当播放器内部出现错误或其它问题时,调用此函数来进行恢复。 186 | * 备注:该函数和stop函数的区别是,reset也能够实现stop的功能,但是reset会去销毁播放器内部的各种变量,然后重新进行变量初始化,view变量等会被设置成空。 187 | */ 188 | - (void)reset; 189 | 190 | /* 191 | 功能:重播,重新播放上一次url地址视频。 192 | */ 193 | - (void)replay; 194 | 195 | /* 196 | 功能:销毁播放器 197 | */ 198 | - (void)releasePlayer; 199 | 200 | /* 201 | 功能:跳转到指定位置进行播放,单位为秒 202 | 备注:在播放器状态AliyunVodPlayerEventFirstFrame之后才能调用此函数。 203 | */ 204 | - (void)seekToTime:(NSTimeInterval)time; 205 | 206 | /** 207 | * 功能:获取媒体信息, 当AliyunVodPlayerEventPrepareDone时,才能获取到该参数对象 208 | */ 209 | - (AliyunVodPlayerVideo *)getAliyunMediaInfo; 210 | 211 | 212 | /** 213 | * 功能:设置边播边缓存功能 214 | * 参数:bEnabled:是否开启缓存功能 215 | * saveDir:缓存存储的路径 216 | * maxSize:缓存路径最大空间 单位:MB 217 | * maxDuration:缓存最大视频最大长度 单位 : 秒 218 | */ 219 | -(void) setPlayingCache:(BOOL)bEnabled saveDir:(NSString*)saveDir maxSize:(int64_t)maxSize maxDuration:(int)maxDuration; 220 | 221 | /** 222 | * 功能: 223 | * 参数:设置渲染视图角度 224 | */ 225 | -(void) setRenderRotate:(RenderRotate)rotate; 226 | 227 | /** 228 | * 功能: 229 | * 参数:设置渲染镜像 230 | */ 231 | -(void) setRenderMirrorMode:(RenderMirrorMode)mirrorMode; 232 | 233 | 234 | - (void) setTraceID:(NSString*)traceId; 235 | 236 | 237 | /** 238 | * AliyunVodPlayerManagerDelegate 播放器代理 239 | */ 240 | @property (nonatomic ,weak) id delegate; 241 | 242 | /** 243 | * 功能:获取视频显示的窗口, 244 | * 备注:此窗口为内部创建的窗口,用户可以用来添加到用户界面上进行显示 245 | */ 246 | @property (nonatomic, assign, readonly) UIView *playerView; 247 | 248 | /** 249 | * 功能:设置/获取是否自动播放 250 | * 备注:如果设置成自动播放,则prepareWithVid之后不需要调用start进行播放 251 | */ 252 | @property (nonatomic, getter=isAutoPlay) BOOL autoPlay; 253 | 254 | /** 255 | * 功能:获取/设置显示模式 256 | * 显示模式有: AliyunVodPlayerDisplayModeFit, // 保持原始比例 257 | AliyunVodPlayerDisplayModeFitWithCropping // 全屏占满屏幕 258 | */ 259 | @property (nonatomic,assign) AliyunVodPlayerDisplayMode displayMode; 260 | 261 | /** 262 | * 功能:设置是否静音,YES为静音 263 | */ 264 | @property (nonatomic, getter=isMuteMode) BOOL muteMode; 265 | 266 | /** 267 | * 功能:播放器初始化后,获取播放器是否播放。 268 | */ 269 | @property (nonatomic, readonly,assign) BOOL isPlaying; 270 | 271 | /** 272 | * 功能:设置网络超时时间,单位毫秒 273 | * 备注:当播放网络流时,设置网络超时时间,默认15000毫秒 274 | */ 275 | @property(nonatomic, assign) int timeout; 276 | 277 | 278 | /** 279 | * 功能:获取旋转角度 280 | */ 281 | @property(nonatomic, readonly) double videoRotation; 282 | 283 | /** 284 | * 功能:是否开启日志发送 285 | */ 286 | @property(nonatomic, assign) BOOL enableLogReport; 287 | 288 | /* 289 | 功能:视频总长度,单位为秒 290 | 备注:在prepareWithVid之后才能够获取时长。 291 | */ 292 | @property (nonatomic, readonly,assign)NSTimeInterval duration; 293 | 294 | /* 295 | 功能:当前视频播放位置,单位为秒 296 | 备注:在开始播放之后才能够获取当前播放位置。 297 | */ 298 | @property (nonatomic, readonly,assign)NSTimeInterval currentTime; 299 | 300 | /* 301 | 功能:获取已经加载的视频长度,或者说对于网络视频来说已经下载的视频时长 302 | 备注:在开始播放之后才能够获取此位置。 303 | */ 304 | @property (nonatomic, readonly,assign)NSTimeInterval loadedTime; 305 | 306 | /** 307 | * 功能:获取视频宽度,只读属性。 308 | * 备注:当调用了prepareToPlay后,并不能立即获得playVideoWidth的值,只有当播放器发送了prepared通知后,videoWidth的值才有效,否则为默认值0。 309 | */ 310 | @property (nonatomic, readonly,assign)int videoWidth; 311 | 312 | /** 313 | * 功能:获取视频高度,只读属性。 314 | * 备注:当调用了prepareToPlay后,并不能立即获得playVideoHeight的值,只有当播放器发送了prepared通知后,videoHeight的值才有效,否则为默认值0。 315 | */ 316 | @property (nonatomic, readonly,assign)int videoHeight; 317 | 318 | /** 319 | * 功能:设置/获取清晰度,用来切换视频清晰度 320 | * 播放器的清晰度有: AliyunVodPlayerVideoFD, // 流畅 321 | AliyunVodPlayerVideoLD, // 标清 322 | AliyunVodPlayerVideoSD, // 高清 323 | AliyunVodPlayerVideoHD, // 超清 324 | AliyunVodPlayerVideo2K, // 2K 325 | AliyunVodPlayerVideo4K, // 4K 326 | AliyunVodPlayerVideoOD, // 原始 327 | 328 | * 备注:在播放之后才能调用 329 | */ 330 | @property (nonatomic, assign) AliyunVodPlayerVideoQuality quality; 331 | 332 | /** 333 | * 功能:设置/获取清晰度,用来切换视频清晰度 334 | * 备注:在播放之后才能调用 335 | */ 336 | @property (nonatomic, assign) NSString* videoDefinition; 337 | 338 | /** 339 | * 功能:设置倍数播放值 340 | * 备注:范围0~2:0.5倍(慢速播放)、1倍(正常播放)、1.5倍(加速播放)、2倍(加速播放) 341 | */ 342 | @property(nonatomic, readwrite) float playSpeed; 343 | 344 | /** 345 | * 功能:日志开关, default : NO 346 | */ 347 | @property (nonatomic, getter=isPrintLog,assign) BOOL printLog; 348 | 349 | /** 350 | * 功能:亮度,调用brightness系统属性,brightness(0~1.0) 351 | */ 352 | @property (nonatomic, readwrite) float brightness; 353 | 354 | /** 355 | * 功能:声音调节,调用系统MPVolumeView类实现,并非视频声音;volume(0~1.0) 356 | */ 357 | @property (nonatomic, assign) float volume; 358 | 359 | /** 360 | * 功能:获取缓冲的时长,只读属性,单位为毫秒。 361 | * 备注:当调用了prepareToPlay后,并且开始播放后,才能获取该值。 362 | */ 363 | @property(nonatomic, readonly) NSTimeInterval bufferPercentage; 364 | 365 | /** 366 | * 功能:循环播放控制 367 | */ 368 | @property(nonatomic, readwrite) BOOL circlePlay; 369 | 370 | /** 371 | * 功能: 372 | * 参数:block:音频数据回调 373 | * 374 | */ 375 | -(void) getAudioData:(void (^)(NSData *data))block; 376 | 377 | /** 378 | * 功能:截取当前正在播放图像 379 | * 380 | */ 381 | -(UIImage*) snapshot; 382 | 383 | /* 384 | 功能:获取此播放器版本号 vision:3.0.0 385 | */ 386 | - (NSString*) getSDKVersion; 387 | 388 | /** 389 | * 功能:当直播时,缓冲区数据大于dropBufferDuration时开始丢数据,单位毫秒,默认8000毫秒 390 | * 备注:必须大于一个GOP的长度。 391 | */ 392 | @property(nonatomic, readwrite) int dropBufferDuration; 393 | 394 | 395 | 396 | /* 397 | *直播接口 398 | */ 399 | //直播时间 400 | @property (nonatomic, assign) NSTimeInterval liveTime; 401 | //播放时间 402 | @property (nonatomic, assign) NSTimeInterval currentPlayTime; 403 | //每60秒更新用户时移时间 404 | @property (nonatomic, strong) AliyunPlayerVideoTimeShiftModel *timeShiftModel; 405 | 406 | - (void)prepareWithLiveTimeUrl:(NSURL *)liveTimeUrl; 407 | 408 | - (void)setLiveTimeShiftUrl:(NSString*)liveTimeShiftUrl; 409 | 410 | - (void)seekToLiveTime:(NSTimeInterval)startTime; 411 | 412 | 413 | @end 414 | 415 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Headers/AliyunVodPlayerDefine.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunVodPlayerDefine.h 3 | // AliyunVodPlayerSDK 4 | // 5 | // Created by SMY on 16/8/31. 6 | // Copyright © 2016年 SMY. All rights reserved. 7 | // 8 | 9 | 10 | typedef NS_ENUM(NSUInteger, AliyunVodPlayerVideoQuality) { //视频质量 11 | AliyunVodPlayerVideoFD = 0, // 流畅 12 | AliyunVodPlayerVideoLD, // 标清 13 | AliyunVodPlayerVideoSD, // 高清 14 | AliyunVodPlayerVideoHD, // 超清 15 | AliyunVodPlayerVideo2K, // 2K 16 | AliyunVodPlayerVideo4K, // 4K 17 | AliyunVodPlayerVideoOD, // 原画 18 | }; 19 | 20 | typedef NS_ENUM(NSUInteger, AliyunVodPlayerEvent) { //视频事件回馈 21 | AliyunVodPlayerEventPrepareDone = 0, 22 | AliyunVodPlayerEventPlay, 23 | AliyunVodPlayerEventFirstFrame, 24 | AliyunVodPlayerEventPause, 25 | AliyunVodPlayerEventStop, 26 | AliyunVodPlayerEventFinish, 27 | AliyunVodPlayerEventBeginLoading, 28 | AliyunVodPlayerEventEndLoading, 29 | AliyunVodPlayerEventSeekDone 30 | }; 31 | 32 | typedef NS_ENUM(NSUInteger, AliyunVodPlayerDisplayMode) { //浏览方式 33 | AliyunVodPlayerDisplayModeFit = 0, // 保持原始比例 34 | AliyunVodPlayerDisplayModeFitWithCropping // 全屏占满屏幕 35 | }; 36 | 37 | typedef NS_ENUM(NSUInteger , AliyunVodRequestMethod) { 38 | AliyunVodRequestMethodPlayAuth = 0, 39 | AliyunVodRequestMethodStsToken, 40 | AliyunVodRequestMethodMtsToken, 41 | }; 42 | 43 | typedef NS_ENUM(NSUInteger, AliyunVodPlayerState) { //视频状态 44 | AliyunVodPlayerStateIdle = 0, //空转,闲时,静态 45 | AliyunVodPlayerStateError, //错误 46 | AliyunVodPlayerStatePrepared, //已准备好 47 | AliyunVodPlayerStatePlay, //播放 48 | AliyunVodPlayerStatePause, //暂停 49 | AliyunVodPlayerStateStop, //停止 50 | AliyunVodPlayerStateFinish, //播放完成 51 | AliyunVodPlayerStateLoading //加载中 52 | }; 53 | 54 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Headers/AliyunVodPlayerSDK.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunVodPlayerSDK.h 3 | // AliyunVodPlayerSDK 4 | // 5 | // Created by SMY on 2016/12/29. 6 | // Copyright © 2016年 SMY. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for AliyunVodPlayerSDK. 12 | FOUNDATION_EXPORT double AliyunVodPlayerSDKVersionNumber; 13 | 14 | //! Project version string for AliyunVodPlayerSDK. 15 | FOUNDATION_EXPORT const unsigned char AliyunVodPlayerSDKVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | #import 21 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Headers/AliyunVodPlayerVideo.h: -------------------------------------------------------------------------------- 1 | // 2 | // AliyunVodPlayerVideo.h 3 | // AliyunVodPlayerSDK 4 | // 5 | // Created by SMY on 16/7/6. 6 | // Copyright © 2016年 SMY. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AliyunVodPlayerDefine.h" 11 | 12 | /* 13 | AliyunVodPlayerVideo为播放视频信息,prepareDone时候返回该类信息 14 | */ 15 | @interface AliyunVodPlayerVideo : NSObject 16 | 17 | /* 18 | videoId为视频ID 19 | */ 20 | @property (nonatomic, strong) NSString *videoId; 21 | 22 | /* 23 | title为视频显示的标题 24 | */ 25 | @property (nonatomic, strong) NSString *title; 26 | 27 | /* 28 | duration为视频总时长,单位为秒 29 | */ 30 | @property (nonatomic, assign) double duration; 31 | 32 | /* 33 | coverUrl为视频封面 34 | */ 35 | @property (nonatomic,copy) NSString *coverUrl; 36 | 37 | /* 38 | videoQuality为视频清晰度 39 | */ 40 | @property (nonatomic, assign) AliyunVodPlayerVideoQuality videoQuality; 41 | 42 | /* 43 | videoQuality为视频清晰度,非枚举类型 44 | */ 45 | @property (nonatomic, copy) NSString *videoDefinition; 46 | 47 | /* 48 | 所有清晰度 49 | */ 50 | @property (nonatomic, strong) NSArray *allSupportQualitys; 51 | 52 | @end 53 | 54 | 55 | @interface AliyunPlayerVideoErrorModel : NSObject 56 | //出错的错误信息 57 | @property (nonatomic, copy) NSString *errorMsg; 58 | //出错的错误码 59 | @property (nonatomic, assign) int errorCode; 60 | //出错的vid 61 | @property (nonatomic, copy) NSString *errorVid; 62 | //出错的url 63 | @property (nonatomic, copy) NSString *errorUrl; 64 | //出错的requestId 65 | @property (nonatomic, copy) NSString *errorRequestId; 66 | 67 | @end 68 | 69 | 70 | @interface AliyunPlayerVideoTimeShiftModel : NSObject 71 | @property (nonatomic, assign) NSTimeInterval startTime; 72 | @property (nonatomic, assign) NSTimeInterval endTime; 73 | @property (nonatomic, assign) NSTimeInterval currentTime; 74 | 75 | 76 | @end 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/syanbo/react-native-aliyun-player/0d0cb418431c458e7d6d22e83264a59841e42cc8/ios/libs/AliyunVodPlayerSDK.framework/Info.plist -------------------------------------------------------------------------------- /ios/libs/AliyunVodPlayerSDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module AliyunVodPlayerSDK { 2 | umbrella header "AliyunVodPlayerSDK.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "name": "react-native-aliyun-player", 4 | "version": "0.0.5", 5 | "description": "", 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [ 11 | "react-native", 12 | "aliyun", 13 | "aliyun-player", 14 | "react", 15 | "player" 16 | ], 17 | "author": "", 18 | "license": "MIT", 19 | "peerDependencies": { 20 | "react-native": "^0.41.2", 21 | "react-native-windows": "0.41.0-rc.1" 22 | 23 | } 24 | } 25 | --------------------------------------------------------------------------------