update
This commit is contained in:
+79
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* IJKAVMoviePlayerController.h
|
||||
*
|
||||
* Copyright (c) 2014 Bilibili
|
||||
* Copyright (c) 2014 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
File: AVPlayerDemoPlaybackViewController.h
|
||||
Abstract: UIViewController managing a playback view, thumbnail view, and associated playback UI.
|
||||
Version: 1.3
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple
|
||||
Inc. ("Apple") in consideration of your agreement to the following
|
||||
terms, and your use, installation, modification or redistribution of
|
||||
this Apple software constitutes acceptance of these terms. If you do
|
||||
not agree with these terms, please do not use, install, modify or
|
||||
redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, Apple grants you a personal, non-exclusive
|
||||
license, under Apple's copyrights in this original Apple software (the
|
||||
"Apple Software"), to use, reproduce, modify and redistribute the Apple
|
||||
Software, with or without modifications, in source and/or binary forms;
|
||||
provided that if you redistribute the Apple Software in its entirety and
|
||||
without modifications, you must retain this notice and the following
|
||||
text and disclaimers in all such redistributions of the Apple Software.
|
||||
Neither the name, trademarks, service marks or logos of Apple Inc. may
|
||||
be used to endorse or promote products derived from the Apple Software
|
||||
without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or
|
||||
implied, are granted by Apple herein, including but not limited to any
|
||||
patent rights that may be infringed by your derivative works or by other
|
||||
works in which the Apple Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE
|
||||
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
|
||||
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
|
||||
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
|
||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
|
||||
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
|
||||
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
|
||||
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Copyright (C) 2014 Apple Inc. All Rights Reserved.
|
||||
|
||||
*/
|
||||
|
||||
#import "IJKMediaPlayback.h"
|
||||
|
||||
@interface IJKAVMoviePlayerController : NSObject <IJKMediaPlayback>
|
||||
|
||||
- (id)initWithContentURL:(NSURL *)aUrl;
|
||||
- (id)initWithContentURLString:(NSString *)aUrl;
|
||||
+ (id)getInstance:(NSString *)aUrl;
|
||||
|
||||
@end
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Bilibili
|
||||
* Copyright (c) 2016 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface IJKFFMonitor : NSObject
|
||||
|
||||
- (instancetype)init;
|
||||
|
||||
@property(nonatomic) NSDictionary *mediaMeta;
|
||||
@property(nonatomic) NSDictionary *videoMeta;
|
||||
@property(nonatomic) NSDictionary *audioMeta;
|
||||
|
||||
@property(nonatomic, readonly) int64_t duration; // milliseconds
|
||||
@property(nonatomic, readonly) int64_t bitrate; // bit / sec
|
||||
@property(nonatomic, readonly) float fps; // frame / sec
|
||||
@property(nonatomic, readonly) int width; // width
|
||||
@property(nonatomic, readonly) int height; // height
|
||||
@property(nonatomic, readonly) NSString *vcodec; // video codec
|
||||
@property(nonatomic, readonly) NSString *acodec; // audio codec
|
||||
@property(nonatomic, readonly) int sampleRate;
|
||||
@property(nonatomic, readonly) int64_t channelLayout;
|
||||
|
||||
@property(nonatomic) NSString *vdecoder;
|
||||
|
||||
@property(nonatomic) int tcpError;
|
||||
@property(nonatomic) NSString *remoteIp;
|
||||
|
||||
@property(nonatomic) int httpError;
|
||||
@property(nonatomic) NSString *httpUrl;
|
||||
@property(nonatomic) NSString *httpHost;
|
||||
@property(nonatomic) int httpCode;
|
||||
@property(nonatomic) int64_t httpOpenTick;
|
||||
@property(nonatomic) int64_t httpSeekTick;
|
||||
@property(nonatomic) int httpOpenCount;
|
||||
@property(nonatomic) int httpSeekCount;
|
||||
@property(nonatomic) int64_t lastHttpOpenDuration;
|
||||
@property(nonatomic) int64_t lastHttpSeekDuration;
|
||||
@property(nonatomic) int64_t filesize;
|
||||
|
||||
@property(nonatomic) int64_t prepareStartTick;
|
||||
@property(nonatomic) int64_t prepareDuration;
|
||||
@property(nonatomic) int64_t firstVideoFrameLatency;
|
||||
@property(nonatomic) int64_t lastPrerollStartTick;
|
||||
@property(nonatomic) int64_t lastPrerollDuration;
|
||||
|
||||
@end
|
||||
+155
@@ -0,0 +1,155 @@
|
||||
/*
|
||||
* IJKFFMoviePlayerController.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import "IJKMediaPlayback.h"
|
||||
#import "IJKFFMonitor.h"
|
||||
#import "IJKFFOptions.h"
|
||||
#import "IJKSDLGLViewProtocol.h"
|
||||
|
||||
// media meta
|
||||
#define k_IJKM_KEY_FORMAT @"format"
|
||||
#define k_IJKM_KEY_DURATION_US @"duration_us"
|
||||
#define k_IJKM_KEY_START_US @"start_us"
|
||||
#define k_IJKM_KEY_BITRATE @"bitrate"
|
||||
|
||||
// stream meta
|
||||
#define k_IJKM_KEY_TYPE @"type"
|
||||
#define k_IJKM_VAL_TYPE__VIDEO @"video"
|
||||
#define k_IJKM_VAL_TYPE__AUDIO @"audio"
|
||||
#define k_IJKM_VAL_TYPE__UNKNOWN @"unknown"
|
||||
|
||||
#define k_IJKM_KEY_CODEC_NAME @"codec_name"
|
||||
#define k_IJKM_KEY_CODEC_PROFILE @"codec_profile"
|
||||
#define k_IJKM_KEY_CODEC_LONG_NAME @"codec_long_name"
|
||||
|
||||
// stream: video
|
||||
#define k_IJKM_KEY_WIDTH @"width"
|
||||
#define k_IJKM_KEY_HEIGHT @"height"
|
||||
#define k_IJKM_KEY_FPS_NUM @"fps_num"
|
||||
#define k_IJKM_KEY_FPS_DEN @"fps_den"
|
||||
#define k_IJKM_KEY_TBR_NUM @"tbr_num"
|
||||
#define k_IJKM_KEY_TBR_DEN @"tbr_den"
|
||||
#define k_IJKM_KEY_SAR_NUM @"sar_num"
|
||||
#define k_IJKM_KEY_SAR_DEN @"sar_den"
|
||||
// stream: audio
|
||||
#define k_IJKM_KEY_SAMPLE_RATE @"sample_rate"
|
||||
#define k_IJKM_KEY_CHANNEL_LAYOUT @"channel_layout"
|
||||
|
||||
#define kk_IJKM_KEY_STREAMS @"streams"
|
||||
|
||||
typedef enum IJKLogLevel {
|
||||
k_IJK_LOG_UNKNOWN = 0,
|
||||
k_IJK_LOG_DEFAULT = 1,
|
||||
|
||||
k_IJK_LOG_VERBOSE = 2,
|
||||
k_IJK_LOG_DEBUG = 3,
|
||||
k_IJK_LOG_INFO = 4,
|
||||
k_IJK_LOG_WARN = 5,
|
||||
k_IJK_LOG_ERROR = 6,
|
||||
k_IJK_LOG_FATAL = 7,
|
||||
k_IJK_LOG_SILENT = 8,
|
||||
} IJKLogLevel;
|
||||
|
||||
@interface IJKFFMoviePlayerController : NSObject <IJKMediaPlayback>
|
||||
|
||||
- (id)initWithContentURL:(NSURL *)aUrl
|
||||
withOptions:(IJKFFOptions *)options;
|
||||
|
||||
- (id)initWithContentURLString:(NSString *)aUrlString
|
||||
withOptions:(IJKFFOptions *)options;
|
||||
|
||||
- (id)initWithMoreContent:(NSURL *)aUrl
|
||||
withOptions:(IJKFFOptions *)options
|
||||
withGLView:(UIView<IJKSDLGLViewProtocol> *)glView;
|
||||
|
||||
- (id)initWithMoreContentString:(NSString *)aUrlString
|
||||
withOptions:(IJKFFOptions *)options
|
||||
withGLView:(UIView<IJKSDLGLViewProtocol> *)glView;
|
||||
|
||||
- (void)prepareToPlay;
|
||||
- (void)play;
|
||||
- (void)pause;
|
||||
- (void)stop;
|
||||
- (BOOL)isPlaying;
|
||||
- (int64_t)trafficStatistic;
|
||||
- (float)dropFrameRate;
|
||||
|
||||
- (void)setPauseInBackground:(BOOL)pause;
|
||||
- (BOOL)isVideoToolboxOpen;
|
||||
|
||||
- (void)setHudValue:(NSString *)value forKey:(NSString *)key;
|
||||
|
||||
+ (void)setLogReport:(BOOL)preferLogReport;
|
||||
+ (void)setLogLevel:(IJKLogLevel)logLevel;
|
||||
+ (BOOL)checkIfFFmpegVersionMatch:(BOOL)showAlert;
|
||||
+ (BOOL)checkIfPlayerVersionMatch:(BOOL)showAlert
|
||||
version:(NSString *)version;
|
||||
|
||||
@property(nonatomic, readonly) CGFloat fpsInMeta;
|
||||
@property(nonatomic, readonly) CGFloat fpsAtOutput;
|
||||
@property(nonatomic) BOOL shouldShowHudView;
|
||||
|
||||
- (void)setOptionValue:(NSString *)value
|
||||
forKey:(NSString *)key
|
||||
ofCategory:(IJKFFOptionCategory)category;
|
||||
|
||||
- (void)setOptionIntValue:(int64_t)value
|
||||
forKey:(NSString *)key
|
||||
ofCategory:(IJKFFOptionCategory)category;
|
||||
|
||||
|
||||
|
||||
- (void)setFormatOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
- (void)setCodecOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
- (void)setSwsOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
- (void)setPlayerOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
|
||||
- (void)setFormatOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
- (void)setCodecOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
- (void)setSwsOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
- (void)setPlayerOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
|
||||
@property (nonatomic, retain) id<IJKMediaUrlOpenDelegate> segmentOpenDelegate;
|
||||
@property (nonatomic, retain) id<IJKMediaUrlOpenDelegate> tcpOpenDelegate;
|
||||
@property (nonatomic, retain) id<IJKMediaUrlOpenDelegate> httpOpenDelegate;
|
||||
@property (nonatomic, retain) id<IJKMediaUrlOpenDelegate> liveOpenDelegate;
|
||||
|
||||
@property (nonatomic, retain) id<IJKMediaNativeInvokeDelegate> nativeInvokeDelegate;
|
||||
|
||||
- (void)didShutdown;
|
||||
|
||||
#pragma mark KVO properties
|
||||
@property (nonatomic, readonly) IJKFFMonitor *monitor;
|
||||
|
||||
@end
|
||||
|
||||
#define IJK_FF_IO_TYPE_READ (1)
|
||||
void IJKFFIOStatDebugCallback(const char *url, int type, int bytes);
|
||||
void IJKFFIOStatRegister(void (*cb)(const char *url, int type, int bytes));
|
||||
|
||||
void IJKFFIOStatCompleteDebugCallback(const char *url,
|
||||
int64_t read_bytes, int64_t total_size,
|
||||
int64_t elpased_time, int64_t total_duration);
|
||||
void IJKFFIOStatCompleteRegister(void (*cb)(const char *url,
|
||||
int64_t read_bytes, int64_t total_size,
|
||||
int64_t elpased_time, int64_t total_duration));
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* IJKFFOptions.h
|
||||
*
|
||||
* Copyright (c) 2013-2015 Bilibili
|
||||
* Copyright (c) 2013-2015 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef enum IJKFFOptionCategory {
|
||||
kIJKFFOptionCategoryFormat = 1,
|
||||
kIJKFFOptionCategoryCodec = 2,
|
||||
kIJKFFOptionCategorySws = 3,
|
||||
kIJKFFOptionCategoryPlayer = 4,
|
||||
kIJKFFOptionCategorySwr = 5,
|
||||
} IJKFFOptionCategory;
|
||||
|
||||
// for codec option 'skip_loop_filter' and 'skip_frame'
|
||||
typedef enum IJKAVDiscard {
|
||||
/* We leave some space between them for extensions (drop some
|
||||
* keyframes for intra-only or drop just some bidir frames). */
|
||||
IJK_AVDISCARD_NONE =-16, ///< discard nothing
|
||||
IJK_AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
|
||||
IJK_AVDISCARD_NONREF = 8, ///< discard all non reference
|
||||
IJK_AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
|
||||
IJK_AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
|
||||
IJK_AVDISCARD_ALL = 48, ///< discard all
|
||||
} IJKAVDiscard;
|
||||
|
||||
struct IjkMediaPlayer;
|
||||
|
||||
@interface IJKFFOptions : NSObject
|
||||
|
||||
+(IJKFFOptions *)optionsByDefault;
|
||||
|
||||
-(void)applyTo:(struct IjkMediaPlayer *)mediaPlayer;
|
||||
|
||||
- (void)setOptionValue:(NSString *)value
|
||||
forKey:(NSString *)key
|
||||
ofCategory:(IJKFFOptionCategory)category;
|
||||
|
||||
- (void)setOptionIntValue:(int64_t)value
|
||||
forKey:(NSString *)key
|
||||
ofCategory:(IJKFFOptionCategory)category;
|
||||
|
||||
|
||||
-(void)setFormatOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
-(void)setCodecOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
-(void)setSwsOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
-(void)setPlayerOptionValue: (NSString *)value forKey:(NSString *)key;
|
||||
|
||||
-(void)setFormatOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
-(void)setCodecOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
-(void)setSwsOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
-(void)setPlayerOptionIntValue: (int64_t)value forKey:(NSString *)key;
|
||||
|
||||
@property(nonatomic) BOOL showHudView;
|
||||
|
||||
@end
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* IJKKVOController.h
|
||||
*
|
||||
* Copyright (c) 2014 Bilibili
|
||||
* Copyright (c) 2014 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface IJKKVOController : NSObject
|
||||
|
||||
- (id)initWithTarget:(NSObject *)target;
|
||||
|
||||
- (void)safelyAddObserver:(NSObject *)observer
|
||||
forKeyPath:(NSString *)keyPath
|
||||
options:(NSKeyValueObservingOptions)options
|
||||
context:(void *)context;
|
||||
- (void)safelyRemoveObserver:(NSObject *)observer
|
||||
forKeyPath:(NSString *)keyPath;
|
||||
|
||||
- (void)safelyRemoveAllObservers;
|
||||
|
||||
@end
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* IJKMPMoviePlayerController.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import "IJKMediaPlayback.h"
|
||||
#import <MediaPlayer/MediaPlayer.h>
|
||||
|
||||
@interface IJKMPMoviePlayerController : MPMoviePlayerController <IJKMediaPlayback>
|
||||
|
||||
- (id)initWithContentURL:(NSURL *)aUrl;
|
||||
- (id)initWithContentURLString:(NSString *)aUrl;
|
||||
|
||||
@end
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* IJKMediaFramework.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
//! Project version number for IJKMediaFramework.
|
||||
FOUNDATION_EXPORT double IJKMediaFrameworkVersionNumber;
|
||||
|
||||
//! Project version string for IJKMediaFramework.
|
||||
FOUNDATION_EXPORT const unsigned char IJKMediaFrameworkVersionString[];
|
||||
|
||||
// In this header, you should import all the public headers of your framework using statements like #import <IJKMediaFrameworkWithSSL/PublicHeader.h>
|
||||
#import <IJKMediaFramework/IJKMediaPlayback.h>
|
||||
#import <IJKMediaFramework/IJKMPMoviePlayerController.h>
|
||||
#import <IJKMediaFramework/IJKFFOptions.h>
|
||||
#import <IJKMediaFramework/IJKFFMoviePlayerController.h>
|
||||
#import <IJKMediaFramework/IJKAVMoviePlayerController.h>
|
||||
#import <IJKMediaFramework/IJKMediaModule.h>
|
||||
#import <IJKMediaFramework/IJKMediaPlayer.h>
|
||||
#import <IJKMediaFramework/IJKNotificationManager.h>
|
||||
#import <IJKMediaFramework/IJKKVOController.h>
|
||||
#import <IJKMediaFramework/IJKSDLGLViewProtocol.h>
|
||||
|
||||
// backward compatible for old names
|
||||
#define IJKMediaPlaybackIsPreparedToPlayDidChangeNotification IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
|
||||
#define IJKMoviePlayerLoadStateDidChangeNotification IJKMPMoviePlayerLoadStateDidChangeNotification
|
||||
#define IJKMoviePlayerPlaybackDidFinishNotification IJKMPMoviePlayerPlaybackDidFinishNotification
|
||||
#define IJKMoviePlayerPlaybackDidFinishReasonUserInfoKey IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey
|
||||
#define IJKMoviePlayerPlaybackStateDidChangeNotification IJKMPMoviePlayerPlaybackStateDidChangeNotification
|
||||
#define IJKMoviePlayerIsAirPlayVideoActiveDidChangeNotification IJKMPMoviePlayerIsAirPlayVideoActiveDidChangeNotification
|
||||
#define IJKMoviePlayerVideoDecoderOpenNotification IJKMPMoviePlayerVideoDecoderOpenNotification
|
||||
#define IJKMoviePlayerFirstVideoFrameRenderedNotification IJKMPMoviePlayerFirstVideoFrameRenderedNotification
|
||||
#define IJKMoviePlayerFirstAudioFrameRenderedNotification IJKMPMoviePlayerFirstAudioFrameRenderedNotification
|
||||
#define IJKMoviePlayerFirstAudioFrameDecodedNotification IJKMPMoviePlayerFirstAudioFrameDecodedNotification
|
||||
#define IJKMoviePlayerFirstVideoFrameDecodedNotification IJKMPMoviePlayerFirstVideoFrameDecodedNotification
|
||||
#define IJKMoviePlayerOpenInputNotification IJKMPMoviePlayerOpenInputNotification
|
||||
#define IJKMoviePlayerFindStreamInfoNotification IJKMPMoviePlayerFindStreamInfoNotification
|
||||
#define IJKMoviePlayerComponentOpenNotification IJKMPMoviePlayerComponentOpenNotification
|
||||
|
||||
#define IJKMPMoviePlayerAccurateSeekCompleteNotification IJKMPMoviePlayerAccurateSeekCompleteNotification
|
||||
#define IJKMoviePlayerSeekAudioStartNotification IJKMPMoviePlayerSeekAudioStartNotification
|
||||
#define IJKMoviePlayerSeekVideoStartNotification IJKMPMoviePlayerSeekVideoStartNotification
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* IJKMediaModule.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface IJKMediaModule : NSObject
|
||||
|
||||
+ (IJKMediaModule *)sharedModule;
|
||||
|
||||
@property(atomic, getter=isAppIdleTimerDisabled) BOOL appIdleTimerDisabled;
|
||||
@property(atomic, getter=isMediaModuleIdleTimerDisabled) BOOL mediaModuleIdleTimerDisabled;
|
||||
|
||||
@end
|
||||
+227
@@ -0,0 +1,227 @@
|
||||
/*
|
||||
* IJKMediaPlayback.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
typedef NS_ENUM(NSInteger, IJKMPMovieScalingMode) {
|
||||
IJKMPMovieScalingModeNone, // No scaling
|
||||
IJKMPMovieScalingModeAspectFit, // Uniform scale until one dimension fits
|
||||
IJKMPMovieScalingModeAspectFill, // Uniform scale until the movie fills the visible bounds. One dimension may have clipped contents
|
||||
IJKMPMovieScalingModeFill // Non-uniform scale. Both render dimensions will exactly match the visible bounds
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSInteger, IJKMPMoviePlaybackState) {
|
||||
IJKMPMoviePlaybackStateStopped,
|
||||
IJKMPMoviePlaybackStatePlaying,
|
||||
IJKMPMoviePlaybackStatePaused,
|
||||
IJKMPMoviePlaybackStateInterrupted,
|
||||
IJKMPMoviePlaybackStateSeekingForward,
|
||||
IJKMPMoviePlaybackStateSeekingBackward
|
||||
};
|
||||
|
||||
typedef NS_OPTIONS(NSUInteger, IJKMPMovieLoadState) {
|
||||
IJKMPMovieLoadStateUnknown = 0,
|
||||
IJKMPMovieLoadStatePlayable = 1 << 0,
|
||||
IJKMPMovieLoadStatePlaythroughOK = 1 << 1, // Playback will be automatically started in this state when shouldAutoplay is YES
|
||||
IJKMPMovieLoadStateStalled = 1 << 2, // Playback will be automatically paused in this state, if started
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSInteger, IJKMPMovieFinishReason) {
|
||||
IJKMPMovieFinishReasonPlaybackEnded,
|
||||
IJKMPMovieFinishReasonPlaybackError,
|
||||
IJKMPMovieFinishReasonUserExited
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Thumbnails
|
||||
|
||||
typedef NS_ENUM(NSInteger, IJKMPMovieTimeOption) {
|
||||
IJKMPMovieTimeOptionNearestKeyFrame,
|
||||
IJKMPMovieTimeOptionExact
|
||||
};
|
||||
|
||||
@protocol IJKMediaPlayback;
|
||||
|
||||
#pragma mark IJKMediaPlayback
|
||||
|
||||
@protocol IJKMediaPlayback <NSObject>
|
||||
|
||||
- (void)prepareToPlay;
|
||||
- (void)play;
|
||||
- (void)pause;
|
||||
- (void)stop;
|
||||
- (BOOL)isPlaying;
|
||||
- (void)shutdown;
|
||||
- (void)setPauseInBackground:(BOOL)pause;
|
||||
|
||||
@property(nonatomic, readonly) UIView *view;
|
||||
@property(nonatomic) NSTimeInterval currentPlaybackTime;
|
||||
@property(nonatomic, readonly) NSTimeInterval duration;
|
||||
@property(nonatomic, readonly) NSTimeInterval playableDuration;
|
||||
@property(nonatomic, readonly) NSInteger bufferingProgress;
|
||||
|
||||
@property(nonatomic, readonly) BOOL isPreparedToPlay;
|
||||
@property(nonatomic, readonly) IJKMPMoviePlaybackState playbackState;
|
||||
@property(nonatomic, readonly) IJKMPMovieLoadState loadState;
|
||||
@property(nonatomic, readonly) int isSeekBuffering;
|
||||
@property(nonatomic, readonly) int isAudioSync;
|
||||
@property(nonatomic, readonly) int isVideoSync;
|
||||
|
||||
@property(nonatomic, readonly) int64_t numberOfBytesTransferred;
|
||||
|
||||
@property(nonatomic, readonly) CGSize naturalSize;
|
||||
@property(nonatomic) IJKMPMovieScalingMode scalingMode;
|
||||
@property(nonatomic) BOOL shouldAutoplay;
|
||||
|
||||
@property (nonatomic) BOOL allowsMediaAirPlay;
|
||||
@property (nonatomic) BOOL isDanmakuMediaAirPlay;
|
||||
@property (nonatomic, readonly) BOOL airPlayMediaActive;
|
||||
|
||||
@property (nonatomic) float playbackRate;
|
||||
@property (nonatomic) float playbackVolume;
|
||||
|
||||
- (UIImage *)thumbnailImageAtCurrentTime;
|
||||
|
||||
#pragma mark Notifications
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define IJK_EXTERN extern "C" __attribute__((visibility ("default")))
|
||||
#else
|
||||
#define IJK_EXTERN extern __attribute__((visibility ("default")))
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// MPMediaPlayback.h
|
||||
|
||||
// Posted when the prepared state changes of an object conforming to the MPMediaPlayback protocol changes.
|
||||
// This supersedes MPMoviePlayerContentPreloadDidFinishNotification.
|
||||
IJK_EXTERN NSString *const IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// MPMoviePlayerController.h
|
||||
// Movie Player Notifications
|
||||
|
||||
// Posted when the scaling mode changes.
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerScalingModeDidChangeNotification;
|
||||
|
||||
// Posted when movie playback ends or a user exits playback.
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackDidFinishNotification;
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey; // NSNumber (IJKMPMovieFinishReason)
|
||||
|
||||
// Posted when the playback state changes, either programatically or by the user.
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerPlaybackStateDidChangeNotification;
|
||||
|
||||
// Posted when the network load state changes.
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerLoadStateDidChangeNotification;
|
||||
|
||||
// Posted when the movie player begins or ends playing video via AirPlay.
|
||||
IJK_EXTERN NSString* const IJKMPMoviePlayerIsAirPlayVideoActiveDidChangeNotification;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Movie Property Notifications
|
||||
|
||||
// Calling -prepareToPlay on the movie player will begin determining movie properties asynchronously.
|
||||
// These notifications are posted when the associated movie property becomes available.
|
||||
IJK_EXTERN NSString* const IJKMPMovieNaturalSizeAvailableNotification;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Extend Notifications
|
||||
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerVideoDecoderOpenNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerFirstVideoFrameRenderedNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerFirstAudioFrameRenderedNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerFirstAudioFrameDecodedNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerFirstVideoFrameDecodedNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerOpenInputNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerFindStreamInfoNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerComponentOpenNotification;
|
||||
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteTargetKey;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerDidSeekCompleteErrorKey;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerDidAccurateSeekCompleteCurPos;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerAccurateSeekCompleteNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerSeekAudioStartNotification;
|
||||
IJK_EXTERN NSString *const IJKMPMoviePlayerSeekVideoStartNotification;
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark IJKMediaUrlOpenDelegate
|
||||
|
||||
// Must equal to the defination in ijkavformat/ijkavformat.h
|
||||
typedef NS_ENUM(NSInteger, IJKMediaEvent) {
|
||||
|
||||
// Notify Events
|
||||
IJKMediaEvent_WillHttpOpen = 1, // attr: url
|
||||
IJKMediaEvent_DidHttpOpen = 2, // attr: url, error, http_code
|
||||
IJKMediaEvent_WillHttpSeek = 3, // attr: url, offset
|
||||
IJKMediaEvent_DidHttpSeek = 4, // attr: url, offset, error, http_code
|
||||
// Control Message
|
||||
IJKMediaCtrl_WillTcpOpen = 0x20001, // IJKMediaUrlOpenData: no args
|
||||
IJKMediaCtrl_DidTcpOpen = 0x20002, // IJKMediaUrlOpenData: error, family, ip, port, fd
|
||||
IJKMediaCtrl_WillHttpOpen = 0x20003, // IJKMediaUrlOpenData: url, segmentIndex, retryCounter
|
||||
IJKMediaCtrl_WillLiveOpen = 0x20005, // IJKMediaUrlOpenData: url, retryCounter
|
||||
IJKMediaCtrl_WillConcatSegmentOpen = 0x20007, // IJKMediaUrlOpenData: url, segmentIndex, retryCounter
|
||||
};
|
||||
|
||||
#define IJKMediaEventAttrKey_url @"url"
|
||||
#define IJKMediaEventAttrKey_host @"host"
|
||||
#define IJKMediaEventAttrKey_error @"error"
|
||||
#define IJKMediaEventAttrKey_time_of_event @"time_of_event"
|
||||
#define IJKMediaEventAttrKey_http_code @"http_code"
|
||||
#define IJKMediaEventAttrKey_offset @"offset"
|
||||
#define IJKMediaEventAttrKey_file_size @"file_size"
|
||||
|
||||
// event of IJKMediaUrlOpenEvent_xxx
|
||||
@interface IJKMediaUrlOpenData: NSObject
|
||||
|
||||
- (id)initWithUrl:(NSString *)url
|
||||
event:(IJKMediaEvent)event
|
||||
segmentIndex:(int)segmentIndex
|
||||
retryCounter:(int)retryCounter;
|
||||
|
||||
@property(nonatomic, readonly) IJKMediaEvent event;
|
||||
@property(nonatomic, readonly) int segmentIndex;
|
||||
@property(nonatomic, readonly) int retryCounter;
|
||||
|
||||
@property(nonatomic, retain) NSString *url;
|
||||
@property(nonatomic, assign) int fd;
|
||||
@property(nonatomic, strong) NSString *msg;
|
||||
@property(nonatomic) int error; // set a negative value to indicate an error has occured.
|
||||
@property(nonatomic, getter=isHandled) BOOL handled; // auto set to YES if url changed
|
||||
@property(nonatomic, getter=isUrlChanged) BOOL urlChanged; // auto set to YES by url changed
|
||||
|
||||
@end
|
||||
|
||||
@protocol IJKMediaUrlOpenDelegate <NSObject>
|
||||
|
||||
- (void)willOpenUrl:(IJKMediaUrlOpenData*) urlOpenData;
|
||||
|
||||
@end
|
||||
|
||||
@protocol IJKMediaNativeInvokeDelegate <NSObject>
|
||||
|
||||
- (int)invoke:(IJKMediaEvent)event attributes:(NSDictionary *)attributes;
|
||||
|
||||
@end
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* IJKMediaPlayer.h
|
||||
*
|
||||
* Copyright (c) 2013 Bilibili
|
||||
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import "IJKMediaPlayback.h"
|
||||
#import "IJKMPMoviePlayerController.h"
|
||||
|
||||
#import "IJKFFOptions.h"
|
||||
#import "IJKFFMoviePlayerController.h"
|
||||
|
||||
#import "IJKAVMoviePlayerController.h"
|
||||
|
||||
#import "IJKMediaModule.h"
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* IJKNotificationManager.h
|
||||
*
|
||||
* Copyright (c) 2016 Bilibili
|
||||
* Copyright (c) 2016 Zhang Rui <bbcallen@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface IJKNotificationManager : NSObject
|
||||
|
||||
- (nullable instancetype)init;
|
||||
|
||||
- (void)addObserver:(nonnull id)observer
|
||||
selector:(nonnull SEL)aSelector
|
||||
name:(nullable NSString *)aName
|
||||
object:(nullable id)anObject;
|
||||
|
||||
- (void)removeAllObservers:(nonnull id)observer;
|
||||
|
||||
@end
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* IJKSDLGLViewProtocol.h
|
||||
*
|
||||
* Copyright (c) 2017 Bilibili
|
||||
* Copyright (c) 2017 raymond <raymondzheng1412@gmail.com>
|
||||
*
|
||||
* This file is part of ijkPlayer.
|
||||
*
|
||||
* ijkPlayer is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* ijkPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with ijkPlayer; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef IJKSDLGLViewProtocol_h
|
||||
#define IJKSDLGLViewProtocol_h
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
typedef struct IJKOverlay IJKOverlay;
|
||||
struct IJKOverlay {
|
||||
int w;
|
||||
int h;
|
||||
UInt32 format;
|
||||
int planes;
|
||||
UInt16 *pitches;
|
||||
UInt8 **pixels;
|
||||
int sar_num;
|
||||
int sar_den;
|
||||
CVPixelBufferRef pixel_buffer;
|
||||
};
|
||||
|
||||
@protocol IJKSDLGLViewProtocol <NSObject>
|
||||
- (UIImage*) snapshot;
|
||||
@property(nonatomic, readonly) CGFloat fps;
|
||||
@property(nonatomic) CGFloat scaleFactor;
|
||||
@property(nonatomic) BOOL isThirdGLView;
|
||||
- (void) display_pixels: (IJKOverlay *) overlay;
|
||||
@end
|
||||
|
||||
#endif /* IJKSDLGLViewProtocol_h */
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+6
@@ -0,0 +1,6 @@
|
||||
framework module IJKMediaFramework {
|
||||
umbrella header "IJKMediaFramework.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
//
|
||||
// ZFIJKPlayerManager.h
|
||||
// ZFPlayer
|
||||
//
|
||||
// Copyright (c) 2016年 任子丰 ( http://github.com/renzifeng )
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#if __has_include(<ZFPlayer/ZFPlayerMediaPlayback.h>)
|
||||
#import <ZFPlayer/ZFPlayerMediaPlayback.h>
|
||||
#else
|
||||
#import "ZFPlayerMediaPlayback.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<IJKMediaFramework/IJKMediaFramework.h>)
|
||||
#import <IJKMediaFramework/IJKMediaFramework.h>
|
||||
|
||||
@interface ZFIJKPlayerManager : NSObject <ZFPlayerMediaPlayback>
|
||||
|
||||
@property (nonatomic, strong, readonly) IJKFFMoviePlayerController *player;
|
||||
|
||||
@property (nonatomic, strong, readonly) IJKFFOptions *options;
|
||||
|
||||
@property (nonatomic, assign) NSTimeInterval timeRefreshInterval;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
+458
@@ -0,0 +1,458 @@
|
||||
//
|
||||
// ZFIJKPlayerManager.m
|
||||
// ZFPlayer
|
||||
//
|
||||
// Copyright (c) 2016年 任子丰 ( http://github.com/renzifeng )
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import "ZFIJKPlayerManager.h"
|
||||
#if __has_include(<ZFPlayer/ZFPlayer.h>)
|
||||
#import <ZFPlayer/ZFPlayer.h>
|
||||
#import <ZFPlayer/ZFPlayerConst.h>
|
||||
#else
|
||||
#import "ZFPlayer.h"
|
||||
#import "ZFPlayerConst.h"
|
||||
#endif
|
||||
#if __has_include(<IJKMediaFramework/IJKMediaFramework.h>)
|
||||
|
||||
@interface ZFIJKPlayerManager ()
|
||||
|
||||
@property (nonatomic, strong) IJKFFMoviePlayerController *player;
|
||||
@property (nonatomic, strong) IJKFFOptions *options;
|
||||
@property (nonatomic, assign) CGFloat lastVolume;
|
||||
@property (nonatomic, strong) NSTimer *timer;
|
||||
@property (nonatomic, assign) BOOL isReadyToPlay;
|
||||
|
||||
@end
|
||||
|
||||
@implementation ZFIJKPlayerManager
|
||||
@synthesize view = _view;
|
||||
@synthesize currentTime = _currentTime;
|
||||
@synthesize totalTime = _totalTime;
|
||||
@synthesize playerPlayTimeChanged = _playerPlayTimeChanged;
|
||||
@synthesize playerBufferTimeChanged = _playerBufferTimeChanged;
|
||||
@synthesize playerDidToEnd = _playerDidToEnd;
|
||||
@synthesize bufferTime = _bufferTime;
|
||||
@synthesize playState = _playState;
|
||||
@synthesize loadState = _loadState;
|
||||
@synthesize assetURL = _assetURL;
|
||||
@synthesize playerPrepareToPlay = _playerPrepareToPlay;
|
||||
@synthesize playerReadyToPlay = _playerReadyToPlay;
|
||||
@synthesize playerPlayStateChanged = _playerPlayStateChanged;
|
||||
@synthesize playerLoadStateChanged = _playerLoadStateChanged;
|
||||
@synthesize seekTime = _seekTime;
|
||||
@synthesize muted = _muted;
|
||||
@synthesize volume = _volume;
|
||||
@synthesize presentationSize = _presentationSize;
|
||||
@synthesize isPlaying = _isPlaying;
|
||||
@synthesize rate = _rate;
|
||||
@synthesize isPreparedToPlay = _isPreparedToPlay;
|
||||
@synthesize shouldAutoPlay = _shouldAutoPlay;
|
||||
@synthesize scalingMode = _scalingMode;
|
||||
@synthesize playerPlayFailed = _playerPlayFailed;
|
||||
@synthesize presentationSizeChanged = _presentationSizeChanged;
|
||||
|
||||
- (void)dealloc {
|
||||
[self stop];
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_scalingMode = ZFPlayerScalingModeAspectFit;
|
||||
_shouldAutoPlay = YES;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)prepareToPlay {
|
||||
if (!_assetURL) return;
|
||||
_isPreparedToPlay = YES;
|
||||
[self initializePlayer];
|
||||
if (self.shouldAutoPlay) {
|
||||
[self play];
|
||||
}
|
||||
self.loadState = ZFPlayerLoadStatePrepare;
|
||||
if (self.playerPrepareToPlay) self.playerPrepareToPlay(self, self.assetURL);
|
||||
}
|
||||
|
||||
- (void)reloadPlayer {
|
||||
[self prepareToPlay];
|
||||
}
|
||||
|
||||
- (void)play {
|
||||
if (!_isPreparedToPlay) {
|
||||
[self prepareToPlay];
|
||||
} else {
|
||||
[self.player play];
|
||||
if (self.timer) [self.timer setFireDate:[NSDate date]];
|
||||
self.player.playbackRate = self.rate;
|
||||
_isPlaying = YES;
|
||||
self.playState = ZFPlayerPlayStatePlaying;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)pause {
|
||||
if (self.timer) [self.timer setFireDate:[NSDate distantFuture]];
|
||||
[self.player pause];
|
||||
_isPlaying = NO;
|
||||
self.playState = ZFPlayerPlayStatePaused;
|
||||
}
|
||||
|
||||
- (void)stop {
|
||||
[self removeMovieNotificationObservers];
|
||||
[self.player shutdown];
|
||||
[self.player.view removeFromSuperview];
|
||||
self.player = nil;
|
||||
_assetURL = nil;
|
||||
[self.timer invalidate];
|
||||
self.presentationSize = CGSizeZero;
|
||||
self.timer = nil;
|
||||
_isPlaying = NO;
|
||||
_isPreparedToPlay = NO;
|
||||
self->_currentTime = 0;
|
||||
self->_totalTime = 0;
|
||||
self->_bufferTime = 0;
|
||||
self.isReadyToPlay = NO;
|
||||
self.playState = ZFPlayerPlayStatePlayStopped;
|
||||
}
|
||||
|
||||
- (void)replay {
|
||||
@zf_weakify(self)
|
||||
[self seekToTime:0 completionHandler:^(BOOL finished) {
|
||||
@zf_strongify(self)
|
||||
if (finished) {
|
||||
[self play];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)seekToTime:(NSTimeInterval)time completionHandler:(void (^ __nullable)(BOOL finished))completionHandler {
|
||||
if (self.player.duration > 0) {
|
||||
self.player.currentPlaybackTime = time;
|
||||
if (completionHandler) completionHandler(YES);
|
||||
} else {
|
||||
self.seekTime = time;
|
||||
}
|
||||
}
|
||||
|
||||
- (UIImage *)thumbnailImageAtCurrentTime {
|
||||
return [self.player thumbnailImageAtCurrentTime];
|
||||
}
|
||||
|
||||
#pragma mark - private method
|
||||
|
||||
- (void)initializePlayer {
|
||||
// IJKFFMoviePlayerController 初始化后,必须手动进行释放,否则会依然存在内存中对资源进行播放。
|
||||
if (self.player) {
|
||||
[self removeMovieNotificationObservers];
|
||||
[self.player shutdown];
|
||||
[self.player.view removeFromSuperview];
|
||||
self.player = nil;
|
||||
}
|
||||
|
||||
self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.assetURL withOptions:self.options];
|
||||
self.player.shouldAutoplay = self.shouldAutoPlay;
|
||||
[self.player prepareToPlay];
|
||||
self.view.playerView = self.player.view;
|
||||
self.scalingMode = self->_scalingMode;
|
||||
[self addPlayerNotificationObservers];
|
||||
}
|
||||
|
||||
- (void)addPlayerNotificationObservers {
|
||||
/// 准备播放
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(loadStateDidChange:)
|
||||
name:IJKMPMoviePlayerLoadStateDidChangeNotification
|
||||
object:_player];
|
||||
/// 播放完成或者用户退出
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(moviePlayBackFinish:)
|
||||
name:IJKMPMoviePlayerPlaybackDidFinishNotification
|
||||
object:_player];
|
||||
/// 准备开始播放了
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(mediaIsPreparedToPlayDidChange:)
|
||||
name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
|
||||
object:_player];
|
||||
/// 播放状态改变了
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(moviePlayBackStateDidChange:)
|
||||
name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
|
||||
object:_player];
|
||||
|
||||
/// 视频的尺寸变化了
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(sizeAvailableChange:)
|
||||
name:IJKMPMovieNaturalSizeAvailableNotification
|
||||
object:self.player];
|
||||
}
|
||||
|
||||
- (void)removeMovieNotificationObservers {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:IJKMPMoviePlayerLoadStateDidChangeNotification
|
||||
object:_player];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:IJKMPMoviePlayerPlaybackDidFinishNotification
|
||||
object:_player];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification
|
||||
object:_player];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:IJKMPMoviePlayerPlaybackStateDidChangeNotification
|
||||
object:_player];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||
name:IJKMPMovieNaturalSizeAvailableNotification
|
||||
object:_player];
|
||||
}
|
||||
|
||||
- (void)timerUpdate {
|
||||
if (self.player.currentPlaybackTime > 0 && !self.isReadyToPlay) {
|
||||
self.isReadyToPlay = YES;
|
||||
self.loadState = ZFPlayerLoadStatePlaythroughOK;
|
||||
}
|
||||
self->_currentTime = self.player.currentPlaybackTime > 0 ? self.player.currentPlaybackTime : 0;
|
||||
self->_totalTime = self.player.duration;
|
||||
self->_bufferTime = self.player.playableDuration;
|
||||
if (self.playerPlayTimeChanged) self.playerPlayTimeChanged(self, self.currentTime, self.totalTime);
|
||||
if (self.playerBufferTimeChanged) self.playerBufferTimeChanged(self, self.bufferTime);
|
||||
}
|
||||
|
||||
#pragma - notification
|
||||
|
||||
/// 播放完成
|
||||
- (void)moviePlayBackFinish:(NSNotification *)notification {
|
||||
int reason = [[[notification userInfo] valueForKey:IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
|
||||
switch (reason) {
|
||||
case IJKMPMovieFinishReasonPlaybackEnded: {
|
||||
ZFPlayerLog(@"playbackStateDidChange: 播放完毕: %d\n", reason);
|
||||
self.playState = ZFPlayerPlayStatePlayStopped;
|
||||
if (self.playerDidToEnd) self.playerDidToEnd(self);
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMovieFinishReasonUserExited: {
|
||||
ZFPlayerLog(@"playbackStateDidChange: 用户退出播放: %d\n", reason);
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMovieFinishReasonPlaybackError: {
|
||||
ZFPlayerLog(@"playbackStateDidChange: 播放出现错误: %d\n", reason);
|
||||
self.playState = ZFPlayerPlayStatePlayFailed;
|
||||
if (self.playerPlayFailed) self.playerPlayFailed(self, @(reason));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ZFPlayerLog(@"playbackPlayBackDidFinish: ???: %d\n", reason);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 准备开始播放了
|
||||
- (void)mediaIsPreparedToPlayDidChange:(NSNotification *)notification {
|
||||
ZFPlayerLog(@"加载状态变成了已经缓存完成,如果设置了自动播放, 会自动播放");
|
||||
// 视频开始播放的时候开启计时器
|
||||
if (!self.timer) {
|
||||
self.timer = [NSTimer scheduledTimerWithTimeInterval:self.timeRefreshInterval > 0 ? self.timeRefreshInterval : 0.1 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
|
||||
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
|
||||
}
|
||||
|
||||
if (self.isPlaying) {
|
||||
[self play];
|
||||
self.muted = self.muted;
|
||||
if (self.seekTime > 0) {
|
||||
[self seekToTime:self.seekTime completionHandler:nil];
|
||||
self.seekTime = 0; // 滞空, 防止下次播放出错
|
||||
[self play];
|
||||
}
|
||||
}
|
||||
if (self.playerReadyToPlay) self.playerReadyToPlay(self, self.assetURL);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - 加载状态改变
|
||||
/**
|
||||
视频加载状态改变了
|
||||
IJKMPMovieLoadStateUnknown == 0
|
||||
IJKMPMovieLoadStatePlayable == 1
|
||||
IJKMPMovieLoadStatePlaythroughOK == 2
|
||||
IJKMPMovieLoadStateStalled == 4
|
||||
*/
|
||||
- (void)loadStateDidChange:(NSNotification*)notification {
|
||||
IJKMPMovieLoadState loadState = self.player.loadState;
|
||||
if ((loadState & IJKMPMovieLoadStatePlayable)) {
|
||||
ZFPlayerLog(@"加载状态变成了缓存数据足够开始播放,但是视频并没有缓存完全");
|
||||
if (self.player.currentPlaybackTime > 0) {
|
||||
self.loadState = ZFPlayerLoadStatePlayable;
|
||||
}
|
||||
} else if ((loadState & IJKMPMovieLoadStatePlaythroughOK)) {
|
||||
// 加载完成,即将播放,停止加载的动画,并将其移除
|
||||
ZFPlayerLog(@"加载状态变成了已经缓存完成,如果设置了自动播放, 会自动播放");
|
||||
} else if ((loadState & IJKMPMovieLoadStateStalled)) {
|
||||
// 可能由于网速不好等因素导致了暂停,重新添加加载的动画
|
||||
ZFPlayerLog(@"网速不好等因素导致了暂停");
|
||||
self.loadState = ZFPlayerLoadStateStalled;
|
||||
} else {
|
||||
ZFPlayerLog(@"加载状态变成了未知状态");
|
||||
self.loadState = ZFPlayerLoadStateUnknown;
|
||||
}
|
||||
}
|
||||
|
||||
// 播放状态改变
|
||||
- (void)moviePlayBackStateDidChange:(NSNotification *)notification {
|
||||
switch (self.player.playbackState) {
|
||||
case IJKMPMoviePlaybackStateStopped: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是停止状态 %d: stoped", (int)_player.playbackState);
|
||||
// 这里的回调也会来多次(一次播放完成, 会回调三次), 所以, 这里不设置
|
||||
self.playState = ZFPlayerPlayStatePlayStopped;
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMoviePlaybackStatePlaying: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是播放状态 %d: playing", (int)_player.playbackState);
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMoviePlaybackStatePaused: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是暂停状态 %d: paused", (int)_player.playbackState);
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMoviePlaybackStateInterrupted: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是中断状态 %d: interrupted", (int)_player.playbackState);
|
||||
}
|
||||
break;
|
||||
|
||||
case IJKMPMoviePlaybackStateSeekingForward: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是向前拖动状态:%d forward",(int)self.player.playbackState);
|
||||
}
|
||||
break;
|
||||
case IJKMPMoviePlaybackStateSeekingBackward: {
|
||||
ZFPlayerLog(@"放器的播放状态变了,现在是向后拖动状态 %d: backward", (int)_player.playbackState);
|
||||
}
|
||||
break;
|
||||
|
||||
default: {
|
||||
ZFPlayerLog(@"播放器的播放状态变了,现在是未知状态 %d: unknown", (int)_player.playbackState);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// 视频的尺寸变化了
|
||||
- (void)sizeAvailableChange:(NSNotification *)notify {
|
||||
self.presentationSize = self.player.naturalSize;
|
||||
self.view.presentationSize = self.presentationSize;
|
||||
if (self.presentationSizeChanged) {
|
||||
self.presentationSizeChanged(self, self->_presentationSize);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - getter
|
||||
|
||||
- (ZFPlayerView *)view {
|
||||
if (!_view) {
|
||||
_view = [[ZFPlayerView alloc] init];
|
||||
}
|
||||
return _view;
|
||||
}
|
||||
|
||||
- (float)rate {
|
||||
return _rate == 0 ?1:_rate;
|
||||
}
|
||||
|
||||
- (IJKFFOptions *)options {
|
||||
if (!_options) {
|
||||
_options = [IJKFFOptions optionsByDefault];
|
||||
/// 精准seek
|
||||
[_options setPlayerOptionIntValue:1 forKey:@"enable-accurate-seek"];
|
||||
/// 解决http播放不了
|
||||
[_options setOptionIntValue:1 forKey:@"dns_cache_clear" ofCategory:kIJKFFOptionCategoryFormat];
|
||||
}
|
||||
return _options;
|
||||
}
|
||||
|
||||
#pragma mark - setter
|
||||
|
||||
- (void)setPlayState:(ZFPlayerPlaybackState)playState {
|
||||
_playState = playState;
|
||||
if (self.playerPlayStateChanged) self.playerPlayStateChanged(self, playState);
|
||||
}
|
||||
|
||||
- (void)setLoadState:(ZFPlayerLoadState)loadState {
|
||||
_loadState = loadState;
|
||||
if (self.playerLoadStateChanged) self.playerLoadStateChanged(self, loadState);
|
||||
}
|
||||
|
||||
- (void)setAssetURL:(NSURL *)assetURL {
|
||||
if (self.player) [self stop];
|
||||
_assetURL = assetURL;
|
||||
[self prepareToPlay];
|
||||
}
|
||||
|
||||
- (void)setRate:(float)rate {
|
||||
_rate = rate;
|
||||
if (self.player && fabsf(_player.playbackRate) > 0.00001f) {
|
||||
self.player.playbackRate = rate;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setMuted:(BOOL)muted {
|
||||
_muted = muted;
|
||||
if (muted) {
|
||||
self.lastVolume = self.player.playbackVolume;
|
||||
self.player.playbackVolume = 0;
|
||||
} else {
|
||||
/// Fix first called the lastVolume is 0.
|
||||
if (self.lastVolume == 0) self.lastVolume = self.player.playbackVolume;
|
||||
self.player.playbackVolume = self.lastVolume;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setScalingMode:(ZFPlayerScalingMode)scalingMode {
|
||||
_scalingMode = scalingMode;
|
||||
self.view.scalingMode = scalingMode;
|
||||
switch (scalingMode) {
|
||||
case ZFPlayerScalingModeNone:
|
||||
self.player.scalingMode = IJKMPMovieScalingModeNone;
|
||||
break;
|
||||
case ZFPlayerScalingModeAspectFit:
|
||||
self.player.scalingMode = IJKMPMovieScalingModeAspectFit;
|
||||
break;
|
||||
case ZFPlayerScalingModeAspectFill:
|
||||
self.player.scalingMode = IJKMPMovieScalingModeAspectFill;
|
||||
break;
|
||||
case ZFPlayerScalingModeFill:
|
||||
self.player.scalingMode = IJKMPMovieScalingModeFill;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setVolume:(float)volume {
|
||||
_volume = MIN(MAX(0, volume), 1);
|
||||
self.player.playbackVolume = volume;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user