FlutterIJK.m 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. CVPixelBufferRef newBuffer = [self.controller framePixelbuffer];
  75. if(newBuffer){
  76. CFRetain(newBuffer);
  77. CVPixelBufferRef pixelBuffer = latestPixelBuffer;
  78. while (!OSAtomicCompareAndSwapPtrBarrier(pixelBuffer, newBuffer, (void **)&latestPixelBuffer)) {
  79. pixelBuffer = latestPixelBuffer;
  80. }
  81. return pixelBuffer;
  82. } return NULL;
  83. }
  84. - (void)setDataSource:(NSString *)uri {
  85. IJKFFOptions *options = [IJKFFOptions optionsByDefault];
  86. self.controller = [[IJKFFMoviePlayerController alloc] initWithContentURLString:uri withOptions:options];
  87. [self.controller prepareToPlay];
  88. displayLink = [CADisplayLink displayLinkWithTarget:self
  89. selector:@selector(onDisplayLink:)];
  90. [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  91. displayLink.paused = YES;
  92. }
  93. - (void)onDisplayLink:(CADisplayLink *)link {
  94. [self.textures textureFrameAvailable:self.textureId];
  95. }
  96. - (void) play{
  97. [self.controller play];
  98. displayLink.paused = NO;
  99. }
  100. - (void) dispose{
  101. [self.controller stop];
  102. [self.controller shutdown];
  103. self.controller = nil;
  104. displayLink.paused = YES;
  105. [displayLink invalidate];
  106. }
  107. @end