FlutterIJK.m 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //
  2. // Created by Caijinglong on 2019-03-08.
  3. //
  4. #import "FlutterIJK.h"
  5. #import <IJKMediaFramework/IJKMediaFramework.h>
  6. #import <IJKMediaFramework/IJKMediaPlayer.h>
  7. #import <AVFoundation/AVFoundation.h>
  8. #import <libkern/OSAtomic.h>
  9. @interface IJKVideoPlayer : NSObject <FlutterTexture>
  10. @property(nonatomic, strong) IJKFFMoviePlayerController *controller;
  11. @property(nonatomic, strong) NSObject <FlutterTextureRegistry> *textures;
  12. @property(nonatomic, assign) int64_t textureId;
  13. - (void)setDataSource:(NSString *)uri;
  14. - (void)play;
  15. - (void)dispose;
  16. @end
  17. @interface FlutterIJK ()
  18. @end
  19. @implementation FlutterIJK {
  20. int64_t textureId;
  21. IJKVideoPlayer *player;
  22. CADisplayLink *displayLink;
  23. }
  24. - (instancetype)initWithRegistrar:(NSObject <FlutterPluginRegistrar> *)registrar {
  25. self = [super init];
  26. if (self) {
  27. self.registrar = registrar;
  28. NSObject <FlutterTextureRegistry> *textures = [self.registrar textures];
  29. player = [IJKVideoPlayer new];
  30. textureId = [textures registerTexture:player];
  31. player.textureId = textureId;
  32. player.textures = textures;
  33. }
  34. return self;
  35. }
  36. + (instancetype)ijkWithRegistrar:(NSObject <FlutterPluginRegistrar> *)registrar {
  37. return [[self alloc] initWithRegistrar:registrar];
  38. }
  39. - (int64_t)id {
  40. return textureId;
  41. }
  42. - (void)dispose {
  43. // IJKFFMoviePlayerController *ctl = [player controller];
  44. // [ctl stop];
  45. // [ctl shutdown];
  46. [[self.registrar textures]unregisterTexture:self.id];
  47. [player dispose];
  48. }
  49. - (void)play {
  50. [player play];
  51. }
  52. - (void)pause {
  53. [[player controller] pause];
  54. }
  55. - (void)stop {
  56. [[player controller] stop];
  57. }
  58. - (void)setDateSourceWithUri:(NSString *)uri {
  59. [player setDataSource:uri];
  60. }
  61. @end
  62. @implementation IJKVideoPlayer {
  63. // IJKFFMoviePlayerController *controller;
  64. CADisplayLink *displayLink;
  65. CVPixelBufferRef latestPixelBuffer;
  66. }
  67. - (instancetype)init {
  68. self = [super init];
  69. if (self) {
  70. }
  71. return self;
  72. }
  73. - (CVPixelBufferRef _Nullable)copyPixelBuffer {
  74. NSLog(@"copyPixelBuffer is running");
  75. CVPixelBufferRef newBuffer = [self.controller framePixelbuffer];
  76. if(newBuffer){
  77. CFRetain(newBuffer);
  78. CVPixelBufferRef pixelBuffer = latestPixelBuffer;
  79. while (!OSAtomicCompareAndSwapPtrBarrier(pixelBuffer, newBuffer, (void **)&latestPixelBuffer)) {
  80. pixelBuffer = latestPixelBuffer;
  81. }
  82. return pixelBuffer;
  83. }
  84. return NULL;
  85. }
  86. - (void)setDataSource:(NSString *)uri {
  87. IJKFFOptions *options = [IJKFFOptions optionsByDefault];
  88. self.controller = [[IJKFFMoviePlayerController alloc] initWithContentURLString:uri withOptions:options];
  89. [self.controller prepareToPlay];
  90. displayLink = [CADisplayLink displayLinkWithTarget:self
  91. selector:@selector(onDisplayLink:)];
  92. [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  93. displayLink.paused = YES;
  94. }
  95. - (void)onDisplayLink:(CADisplayLink *)link {
  96. [self.textures textureFrameAvailable:self.textureId];
  97. // CVPixelBufferRef ref = [self copyPixelBuffer];
  98. // NSLog(@"buffer = %p", ref);
  99. }
  100. - (void) play{
  101. [self.controller play];
  102. displayLink.paused = NO;
  103. }
  104. - (void) dispose{
  105. [self.controller stop];
  106. [self.controller shutdown];
  107. self.controller = nil;
  108. displayLink.paused = YES;
  109. [displayLink invalidate];
  110. }
  111. @end