提交 80f507eb 编写于 作者: Z Zhang Rui

ios: retrieve meta

上级 1313cf83
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
E6F727BD17F40C360043623F /* IJKMPMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DBF17EEC65200354D80 /* IJKMPMoviePlayerController.h */; }; E6F727BD17F40C360043623F /* IJKMPMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DBF17EEC65200354D80 /* IJKMPMoviePlayerController.h */; };
E6F727BE17F40C390043623F /* IJKFFMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DE517EFD9C300354D80 /* IJKFFMoviePlayerController.h */; }; E6F727BE17F40C390043623F /* IJKFFMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DE517EFD9C300354D80 /* IJKFFMoviePlayerController.h */; };
E6F727C217F7C9BA0043623F /* IJKMediaPlayback.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F727C117F7C9B90043623F /* IJKMediaPlayback.m */; }; E6F727C217F7C9BA0043623F /* IJKMediaPlayback.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F727C117F7C9B90043623F /* IJKMediaPlayback.m */; };
E6FAD9571A515CE300725002 /* ijkmeta.c in Sources */ = {isa = PBXBuildFile; fileRef = E6FAD9551A515CE300725002 /* ijkmeta.c */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
...@@ -265,6 +266,8 @@ ...@@ -265,6 +266,8 @@
E6F727B917F2D9D30043623F /* IJKFFMoviePlayerDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJKFFMoviePlayerDef.h; sourceTree = "<group>"; }; E6F727B917F2D9D30043623F /* IJKFFMoviePlayerDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJKFFMoviePlayerDef.h; sourceTree = "<group>"; };
E6F727BA17F2D9D30043623F /* IJKFFMoviePlayerDef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJKFFMoviePlayerDef.m; sourceTree = "<group>"; }; E6F727BA17F2D9D30043623F /* IJKFFMoviePlayerDef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJKFFMoviePlayerDef.m; sourceTree = "<group>"; };
E6F727C117F7C9B90043623F /* IJKMediaPlayback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJKMediaPlayback.m; path = IJKMediaPlayer/IJKMediaPlayback.m; sourceTree = "<group>"; }; E6F727C117F7C9B90043623F /* IJKMediaPlayback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJKMediaPlayback.m; path = IJKMediaPlayer/IJKMediaPlayback.m; sourceTree = "<group>"; };
E6FAD9551A515CE300725002 /* ijkmeta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ijkmeta.c; sourceTree = "<group>"; };
E6FAD9561A515CE300725002 /* ijkmeta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ijkmeta.h; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -563,6 +566,8 @@ ...@@ -563,6 +566,8 @@
E6903FDE17EAFC6100CFD954 /* ff_ffplay_def.h */, E6903FDE17EAFC6100CFD954 /* ff_ffplay_def.h */,
E6903FDB17EAFC6100CFD954 /* ff_ffplay.c */, E6903FDB17EAFC6100CFD954 /* ff_ffplay.c */,
E6903FDC17EAFC6100CFD954 /* ff_ffplay.h */, E6903FDC17EAFC6100CFD954 /* ff_ffplay.h */,
E6FAD9551A515CE300725002 /* ijkmeta.c */,
E6FAD9561A515CE300725002 /* ijkmeta.h */,
E66F8DEE17EFEA9400354D80 /* ijkplayer_internal.h */, E66F8DEE17EFEA9400354D80 /* ijkplayer_internal.h */,
E66F8DEF17EFEA9400354D80 /* ijkplayer.c */, E66F8DEF17EFEA9400354D80 /* ijkplayer.c */,
E66F8DF017EFEA9400354D80 /* ijkplayer.h */, E66F8DF017EFEA9400354D80 /* ijkplayer.h */,
...@@ -764,6 +769,7 @@ ...@@ -764,6 +769,7 @@
E6EE92B91878230C009EAB56 /* ijksdl_thread_ios.m in Sources */, E6EE92B91878230C009EAB56 /* ijksdl_thread_ios.m in Sources */,
E66F8DC117EEC65200354D80 /* IJKMPMoviePlayerController.m in Sources */, E66F8DC117EEC65200354D80 /* IJKMPMoviePlayerController.m in Sources */,
E67C4E0819D15EEA00415CEE /* IJKAVMoviePlayerController.m in Sources */, E67C4E0819D15EEA00415CEE /* IJKAVMoviePlayerController.m in Sources */,
E6FAD9571A515CE300725002 /* ijkmeta.c in Sources */,
E6EE92B81878230C009EAB56 /* ijksdl_aout_ios_audiounit.m in Sources */, E6EE92B81878230C009EAB56 /* ijksdl_aout_ios_audiounit.m in Sources */,
E6EE92C21878236A009EAB56 /* IJKSDLAudioQueueController.m in Sources */, E6EE92C21878236A009EAB56 /* IJKSDLAudioQueueController.m in Sources */,
E67B91BA1A3801E600717EA9 /* ffpipenode_ffplay_vout.c in Sources */, E67B91BA1A3801E600717EA9 /* ffpipenode_ffplay_vout.c in Sources */,
......
...@@ -23,6 +23,37 @@ ...@@ -23,6 +23,37 @@
#import "IJKMediaPlayback.h" #import "IJKMediaPlayback.h"
#import "IJKFFOptions.h" #import "IJKFFOptions.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"
@interface IJKFFMoviePlayerController : NSObject <IJKMediaPlayback> @interface IJKFFMoviePlayerController : NSObject <IJKMediaPlayback>
- (id)initWithContentURL:(NSURL *)aUrl - (id)initWithContentURL:(NSURL *)aUrl
...@@ -46,6 +77,8 @@ ...@@ -46,6 +77,8 @@
+ (void)setLogReport:(BOOL)preferLogReport; + (void)setLogReport:(BOOL)preferLogReport;
@property(nonatomic, readonly) CGFloat fpsInMeta;
@end @end
#define IJK_FF_IO_TYPE_READ (1) #define IJK_FF_IO_TYPE_READ (1)
......
...@@ -30,6 +30,11 @@ ...@@ -30,6 +30,11 @@
#include "string.h" #include "string.h"
@interface IJKFFMoviePlayerController() <IJKAudioSessionDelegate> @interface IJKFFMoviePlayerController() <IJKAudioSessionDelegate>
@property(nonatomic, readonly) NSDictionary *mediaMeta;
@property(nonatomic, readonly) NSDictionary *videoMeta;
@property(nonatomic, readonly) NSDictionary *audioMeta;
@end @end
@implementation IJKFFMoviePlayerController { @implementation IJKFFMoviePlayerController {
...@@ -70,6 +75,10 @@ ...@@ -70,6 +75,10 @@
@synthesize scalingMode = _scalingMode; @synthesize scalingMode = _scalingMode;
@synthesize shouldAutoplay = _shouldAutoplay; @synthesize shouldAutoplay = _shouldAutoplay;
@synthesize mediaMeta = _mediaMeta;
@synthesize videoMeta = _videoMeta;
@synthesize audioMeta = _audioMeta;
#define FFP_IO_STAT_STEP (50 * 1024) #define FFP_IO_STAT_STEP (50 * 1024)
// as an example // as an example
...@@ -161,6 +170,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, ...@@ -161,6 +170,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url,
// init media resource // init media resource
_ffMrl = [[IJKFFMrl alloc] initWithMrl:aUrlString]; _ffMrl = [[IJKFFMrl alloc] initWithMrl:aUrlString];
_segmentResolver = segmentResolver; _segmentResolver = segmentResolver;
_mediaMeta = [[NSDictionary alloc] init];
// init player // init player
_mediaPlayer = ijkmp_ios_create(media_player_msg_loop); _mediaPlayer = ijkmp_ios_create(media_player_msg_loop);
...@@ -410,6 +420,23 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, ...@@ -410,6 +420,23 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url,
return nil; return nil;
} }
inline static void fillMetaInternal(NSMutableDictionary *meta, IjkMediaMeta *rawMeta, const char *name, NSString *defaultValue)
{
if (!meta || !rawMeta || !name)
return;
NSString *key = [NSString stringWithUTF8String:name];
char *value = ijkmeta_get_string_l(rawMeta, name);
if (value) {
[meta setObject:[NSString stringWithUTF8String:value] forKey:key];
free(value);
} else if (defaultValue){
[meta setObject:defaultValue forKey:key];
} else {
[meta removeObjectForKey:key];
}
}
- (void)postEvent: (IJKFFMoviePlayerMessage *)msg - (void)postEvent: (IJKFFMoviePlayerMessage *)msg
{ {
if (!msg) if (!msg)
...@@ -436,9 +463,85 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, ...@@ -436,9 +463,85 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url,
@"error": @(avmsg->arg1)}]; @"error": @(avmsg->arg1)}];
break; break;
} }
case FFP_MSG_PREPARED: case FFP_MSG_PREPARED: {
NSLog(@"FFP_MSG_PREPARED:"); NSLog(@"FFP_MSG_PREPARED:");
IjkMediaMeta *rawMeta = ijkmp_get_meta_l(_mediaPlayer);
if (rawMeta) {
ijkmeta_lock(rawMeta);
NSMutableDictionary *newMediaMeta = [[NSMutableDictionary alloc] init];
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_FORMAT, nil);
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_DURATION_US, nil);
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_START_US, nil);
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_BITRATE, nil);
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_VIDEO_STREAM, @"-1");
fillMetaInternal(newMediaMeta, rawMeta, IJKM_KEY_AUDIO_STREAM, @"-1");
int64_t video_stream = ijkmeta_get_int64_l(rawMeta, IJKM_KEY_VIDEO_STREAM, -1);
int64_t audio_stream = ijkmeta_get_int64_l(rawMeta, IJKM_KEY_AUDIO_STREAM, -1);
NSMutableArray *streams = [[NSMutableArray alloc] init];
size_t count = ijkmeta_get_children_count_l(rawMeta);
for(size_t i = 0; i < count; ++i) {
IjkMediaMeta *streamRawMeta = ijkmeta_get_child_l(rawMeta, i);
NSMutableDictionary *streamMeta = [[NSMutableDictionary alloc] init];
if (streamRawMeta) {
fillMetaInternal(streamMeta, streamRawMeta, IJKM_KEY_TYPE, k_IJKM_VAL_TYPE__UNKNOWN);
char *type = ijkmeta_get_string_l(rawMeta, IJKM_KEY_TYPE);
if (type) {
fillMetaInternal(streamMeta, streamRawMeta, IJKM_KEY_CODEC_NAME, @"");
fillMetaInternal(streamMeta, streamRawMeta, IJKM_KEY_CODEC_PROFILE, @"");
if (0 == strcmp(type, IJKM_VAL_TYPE__VIDEO)) {
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_WIDTH, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_HEIGHT, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_FPS_NUM, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_FPS_DEN, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_TBR_NUM, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_TBR_DEN, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_SAR_NUM, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_SAR_DEN, @"");
if (video_stream > 0 && video_stream == i) {
_videoMeta = streamMeta;
int64_t fps_num = ijkmeta_get_int64_l(rawMeta, IJKM_KEY_FPS_NUM, 0);
int64_t fps_den = ijkmeta_get_int64_l(rawMeta, IJKM_KEY_FPS_DEN, 0);
if (fps_num > 0 && fps_den > 0) {
_fpsInMeta = ((CGFloat)(fps_num)) / fps_den;
NSLog(@"fps in meta %f\n", _fpsInMeta);
}
}
} else if (0 == strcmp(type, IJKM_VAL_TYPE__AUDIO)) {
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_SAMPLE_RATE, @"");
fillMetaInternal(streamMeta, rawMeta, IJKM_KEY_CHANNEL_LAYOUT, @"");
if (audio_stream > 0 && audio_stream == i) {
_audioMeta = streamMeta;
}
} else {
}
free(type);
}
}
[streams addObject:streamMeta];
}
[newMediaMeta setObject:streams forKey:kk_IJKM_KEY_STREAMS];
ijkmeta_unlock(rawMeta);
_mediaMeta = newMediaMeta;
}
_isPreparedToPlay = YES; _isPreparedToPlay = YES;
[[NSNotificationCenter defaultCenter] postNotificationName:IJKMediaPlaybackIsPreparedToPlayDidChangeNotification object:self]; [[NSNotificationCenter defaultCenter] postNotificationName:IJKMediaPlaybackIsPreparedToPlayDidChangeNotification object:self];
...@@ -450,6 +553,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, ...@@ -450,6 +553,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url,
object:self]; object:self];
break; break;
}
case FFP_MSG_COMPLETED: { case FFP_MSG_COMPLETED: {
[self setScreenOn:NO]; [self setScreenOn:NO];
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#include "ijkplayer/ios/ijkplayer_ios.h" #include "ijkplayer/ios/ijkplayer_ios.h"
#include "ijkplayer/ijkmeta.h"
struct IJKSize { struct IJKSize {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册