From 80f507ebd3aeb3c3cfda571e645c6c7984eef2c1 Mon Sep 17 00:00:00 2001 From: Zhang Rui Date: Tue, 30 Dec 2014 03:26:36 +0800 Subject: [PATCH] ios: retrieve meta --- .../IJKMediaPlayer.xcodeproj/project.pbxproj | 6 + .../IJKFFMoviePlayerController.h | 33 ++++++ .../IJKFFMoviePlayerController.m | 106 +++++++++++++++++- .../IJKMediaPlayer/IJKFFMoviePlayerDef.h | 2 +- 4 files changed, 145 insertions(+), 2 deletions(-) diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj index 779d6a39..2e5bd65c 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj +++ b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ E6F727BD17F40C360043623F /* IJKMPMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DBF17EEC65200354D80 /* IJKMPMoviePlayerController.h */; }; E6F727BE17F40C390043623F /* IJKFFMoviePlayerController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E66F8DE517EFD9C300354D80 /* IJKFFMoviePlayerController.h */; }; 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 */ /* Begin PBXCopyFilesBuildPhase section */ @@ -265,6 +266,8 @@ E6F727B917F2D9D30043623F /* IJKFFMoviePlayerDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IJKFFMoviePlayerDef.h; sourceTree = ""; }; E6F727BA17F2D9D30043623F /* IJKFFMoviePlayerDef.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IJKFFMoviePlayerDef.m; sourceTree = ""; }; E6F727C117F7C9B90043623F /* IJKMediaPlayback.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = IJKMediaPlayback.m; path = IJKMediaPlayer/IJKMediaPlayback.m; sourceTree = ""; }; + E6FAD9551A515CE300725002 /* ijkmeta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ijkmeta.c; sourceTree = ""; }; + E6FAD9561A515CE300725002 /* ijkmeta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ijkmeta.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -563,6 +566,8 @@ E6903FDE17EAFC6100CFD954 /* ff_ffplay_def.h */, E6903FDB17EAFC6100CFD954 /* ff_ffplay.c */, E6903FDC17EAFC6100CFD954 /* ff_ffplay.h */, + E6FAD9551A515CE300725002 /* ijkmeta.c */, + E6FAD9561A515CE300725002 /* ijkmeta.h */, E66F8DEE17EFEA9400354D80 /* ijkplayer_internal.h */, E66F8DEF17EFEA9400354D80 /* ijkplayer.c */, E66F8DF017EFEA9400354D80 /* ijkplayer.h */, @@ -764,6 +769,7 @@ E6EE92B91878230C009EAB56 /* ijksdl_thread_ios.m in Sources */, E66F8DC117EEC65200354D80 /* IJKMPMoviePlayerController.m in Sources */, E67C4E0819D15EEA00415CEE /* IJKAVMoviePlayerController.m in Sources */, + E6FAD9571A515CE300725002 /* ijkmeta.c in Sources */, E6EE92B81878230C009EAB56 /* ijksdl_aout_ios_audiounit.m in Sources */, E6EE92C21878236A009EAB56 /* IJKSDLAudioQueueController.m in Sources */, E67B91BA1A3801E600717EA9 /* ffpipenode_ffplay_vout.c in Sources */, diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.h b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.h index 805b59a9..becba812 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.h +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.h @@ -23,6 +23,37 @@ #import "IJKMediaPlayback.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 - (id)initWithContentURL:(NSURL *)aUrl @@ -46,6 +77,8 @@ + (void)setLogReport:(BOOL)preferLogReport; +@property(nonatomic, readonly) CGFloat fpsInMeta; + @end #define IJK_FF_IO_TYPE_READ (1) diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m index 82bd6094..283350c6 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m @@ -30,6 +30,11 @@ #include "string.h" @interface IJKFFMoviePlayerController() + +@property(nonatomic, readonly) NSDictionary *mediaMeta; +@property(nonatomic, readonly) NSDictionary *videoMeta; +@property(nonatomic, readonly) NSDictionary *audioMeta; + @end @implementation IJKFFMoviePlayerController { @@ -70,6 +75,10 @@ @synthesize scalingMode = _scalingMode; @synthesize shouldAutoplay = _shouldAutoplay; +@synthesize mediaMeta = _mediaMeta; +@synthesize videoMeta = _videoMeta; +@synthesize audioMeta = _audioMeta; + #define FFP_IO_STAT_STEP (50 * 1024) // as an example @@ -161,6 +170,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, // init media resource _ffMrl = [[IJKFFMrl alloc] initWithMrl:aUrlString]; _segmentResolver = segmentResolver; + _mediaMeta = [[NSDictionary alloc] init]; // init player _mediaPlayer = ijkmp_ios_create(media_player_msg_loop); @@ -410,6 +420,23 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, 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 { if (!msg) @@ -436,9 +463,85 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, @"error": @(avmsg->arg1)}]; break; } - case FFP_MSG_PREPARED: + case 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; [[NSNotificationCenter defaultCenter] postNotificationName:IJKMediaPlaybackIsPreparedToPlayDidChangeNotification object:self]; @@ -450,6 +553,7 @@ void IJKFFIOStatCompleteRegister(void (*cb)(const char *url, object:self]; break; + } case FFP_MSG_COMPLETED: { [self setScreenOn:NO]; diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerDef.h b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerDef.h index 3b77582d..3e2e7437 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerDef.h +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerDef.h @@ -22,7 +22,7 @@ #import #include "ijkplayer/ios/ijkplayer_ios.h" - +#include "ijkplayer/ijkmeta.h" struct IJKSize { -- GitLab