Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,24 @@ android {
lintOptions {
disable 'InvalidPackage'
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']//指定lib库目录
}
}
repositories {
flatDir {
dirs 'libs'
}
}
}


dependencies {

// implementation(name: 'fijkplayer-full-release', ext: 'aar')

// fijkplayer-full include the java lib and native shared libs for armv5 armv7 arm64 x86 x86_64
// implementation fileTree(include:['*.aar'],dir:'libs')
// implementation(name: 'fijkplayer-full-release', ext: 'aar')
// fijkplayer-full include the java lib and native shared libs for armv5 armv7 arm64 x86 x86_64
implementation 'com.befovy.fijkplayer:fijkplayer-full:0.7.6'
implementation 'androidx.annotation:annotation:1.1.0'
}
2 changes: 1 addition & 1 deletion android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
1 change: 1 addition & 0 deletions android/libs/.gitkeep
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
这里的文件夹下放 fijkplayer-full-release.aar
6 changes: 5 additions & 1 deletion android/src/main/java/com/befovy/fijkplayer/FijkPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,11 @@ private void handleEvent(int what, int arg1, int arg2, Object extra) {
mEventSink.success(event);
break;
case ERROR:
mEventSink.error(String.valueOf(arg1), extra.toString(), arg2);
if(extra!=null){
mEventSink.error(String.valueOf(arg1), extra.toString(), arg2);
}else{
mEventSink.error(String.valueOf(arg1), "", arg2);
}
break;
default:
// Log.d("FLUTTER", "jonEvent:" + what);
Expand Down
1 change: 1 addition & 0 deletions ios/Classes/FijkPlayer.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#import <Foundation/Foundation.h>
#import <IJKMediaPlayer/IJKMediaPlayer.h>
//#import <IJKMediaFramework/IJKMediaPlayer.h>

#import <Flutter/FlutterPlugin.h>

Expand Down
32 changes: 31 additions & 1 deletion ios/Classes/FijkPlayer.m
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

#import <Flutter/Flutter.h>
#import <Foundation/Foundation.h>
//#import <IJKMediaPlayer/IJKMediaPlayer.h>
#import <IJKMediaPlayer/IJKMediaPlayer.h>
#import <libkern/OSAtomic.h>
#import <stdatomic.h>
Expand Down Expand Up @@ -447,6 +448,25 @@ - (void) takeSnapshot{
}
}];
}
-(void)startRecord:(NSString *) fileFullPath {
int state = [_ijkMediaPlayer startRecordVideo:fileFullPath];
// int state = [_ijkMediaPlayer rtspRecordVideo:rtspUrl filePath:fileFullPath bStop:NO];
if(state==0){
NSDictionary *args = @{@"result":@YES};
[self->_methodChannel invokeMethod:@"_onStartRecord" arguments:args];
}else{
[self->_methodChannel invokeMethod:@"_onStartRecord" arguments:@"startRecord error"];
}
}
-(void) stopRecord{
int state = [_ijkMediaPlayer stopRecordVideo];
if(state==0){
NSDictionary *args = @{@"result":@YES};
[self->_methodChannel invokeMethod:@"_onStopRecord" arguments:args];
}else{
[self->_methodChannel invokeMethod:@"_onStopRecord" arguments:@"stopRecord error"];
}
}

- (void)handleMethodCall:(FlutterMethodCall *)call
result:(FlutterResult)result {
Expand Down Expand Up @@ -579,7 +599,17 @@ - (void)handleMethodCall:(FlutterMethodCall *)call
} else if ([@"snapshot" isEqualToString:call.method]) {
[self takeSnapshot];
result(nil);
} else {
} else if([@"startRecord" isEqualToString:call.method]){
NSString *fileName = argsMap[@"fileName"];
// NSString *url = argsMap[@"rtspUrl"];
// self->filePath = fileName;
// self->rtspUrl=url;
[self startRecord:fileName];
result(nil);
} else if([@"stopRecord" isEqualToString:call.method]){
[self stopRecord];
result(nil);
}else {
result(FlutterMethodNotImplemented);
}
}
Expand Down
1 change: 1 addition & 0 deletions ios/Frameworks/.gitkeep
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
这里的文件夹下放 IJKMediaPlayer.framework
44 changes: 44 additions & 0 deletions lib/core/fijkplayer.dart
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ class FijkPlayer extends ChangeNotifier implements ValueListenable<FijkValue> {

final Completer<int> _nativeSetup;
Completer<Uint8List> _snapShot;
Completer<bool> _isStartRecord;
Completer<bool> _isStopRecord;

FijkPlayer()
: _nativeSetup = Completer(),
Expand Down Expand Up @@ -153,6 +155,24 @@ class FijkPlayer extends ChangeNotifier implements ValueListenable<FijkValue> {
}
_snapShot = null;
break;
case "_onStartRecord":
var m = call.arguments;
if(m is Map){
_isStartRecord.complete(m["result"]);
}else{
_isStartRecord.completeError(UnsupportedError("startRecord"));
}
_isStartRecord = null;
break;
case "_onStopRecord":
var m = call.arguments;
if(m is Map){
_isStopRecord.complete(m["result"]);
}else{
_isStopRecord.completeError(UnsupportedError("stopRecord"));
}
_isStopRecord = null;
break;
default:
break;
}
Expand Down Expand Up @@ -245,6 +265,30 @@ class FijkPlayer extends ChangeNotifier implements ValueListenable<FijkValue> {
_channel.invokeMethod("snapshot");
return _snapShot.future;
}
/// 视频录制开始方法
/// fileName :文件名
Future<bool> takeStartRecord(String fileName) async {
await _nativeSetup.future;
FijkLog.i("$this takeStartRecord");
if(_isStartRecord!=null && !_isStartRecord.isCompleted){
return Future.error(StateError("last takeStartRecord is not finished"));
}
_isStartRecord = Completer<bool>();
_channel.invokeMethod("startRecord",<String, dynamic>{'fileName': fileName});
return _isStartRecord.future;
}
/// 视频录制结束方法
/// fileName :文件名
Future<bool> takeStopRecord() async {
await _nativeSetup.future;
FijkLog.i("$this takeStopRecord");
if(_isStopRecord!=null && !_isStopRecord.isCompleted){
return Future.error(StateError("last takeStopRecord is not finished"));
}
_isStopRecord = Completer<bool>();
_channel.invokeMethod("stopRecord");
return _isStopRecord.future;
}

/// Set data source for this player
///
Expand Down