Skip to content

Commit 396a81e

Browse files
alr2413GuillermoDLCOmitchrosssolid-yuriiprykhodko
authored
6.0.3: Added vlc recording feature (#230)
* updated vlc event handling code * fix vlc error description * renamed error const strings * fixed a minor bug * Avoid FlutterVlcPlayerFactory new instances onAttachedToActivity (#214) * Avoid FlutterVlcPlayerFactory new instances onAttachedToActivity * Avoid FlutterVlcPlayerFactory instances in registerWith * fix error description docs * Added onInit & onRenderer listeners * updated docs mark onInit & onRendererHandler as deprecated. * updated documentation * fix initialization value of renderer variables * fixed vlc error on adding a local subtitle/audio * Added recording feature * fix a minor issue * updated platform recording methods * updated ios recording methods * updated pubspec * Update flutter_vlc_player/ios/Classes/VlcViewBuilder.swift Co-authored-by: Yuri Prykhodko <[email protected]> * Update flutter_vlc_player/example/lib/vlc_player_with_controls.dart Co-authored-by: Yuri Prykhodko <[email protected]> * Update flutter_vlc_player/example/lib/single_tab.dart Co-authored-by: Yuri Prykhodko <[email protected]> * Update flutter_vlc_player/example/lib/single_tab.dart Co-authored-by: Yuri Prykhodko <[email protected]> * Update flutter_vlc_player/example/lib/single_tab.dart Co-authored-by: Yuri Prykhodko <[email protected]> * Update flutter_vlc_player/example/lib/vlc_player_with_controls.dart Co-authored-by: Yuri Prykhodko <[email protected]> * fixed mentioned issues migrated from pedantic to lint package updated readme * added http options updated readme * updated readme * removed http options updated readme Co-authored-by: Guillermo Jeremy De La Cruz Onton <[email protected]> Co-authored-by: Mitch Ross <[email protected]> Co-authored-by: Yuri Prykhodko <[email protected]>
1 parent 35ffe79 commit 396a81e

31 files changed

+1072
-601
lines changed

README.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ android {
103103
-keep class org.videolan.libvlc.** { *; }
104104
```
105105

106+
<br>
107+
106108
## Quick Start
107109
To start using the plugin, copy this code or follow the example project in 'flutter_vlc_player/example'
108110

@@ -172,12 +174,12 @@ class _MyHomePageState extends State<MyHomePage> {
172174
}
173175
}
174176
```
177+
<br>
175178

179+
### Recording feature
180+
To start/stop video recording, you have to call the `startRecording(String saveDirectory)` and `stopRecording()` methods, respectively. By calling the stop method you can get the path of recorded file from `vlcPlayerController.value.recordPath`.
176181

177-
178-
179-
180-
182+
<hr>
181183

182184
## Upgrade instructions
183185

@@ -203,13 +205,21 @@ If you have some changes made to the iOS app, recreate the app using above metho
203205

204206
Be sure to follow instructions above after
205207

206-
<hr>
208+
<br>
207209

208210
### Breaking Changes (from V4 to V5)
209211
Entire platform has been refactored in v5. It will require a refactor of your app to follow v5.
210212

211213
<hr>
212214

215+
## Known Issues
216+
<b>1)</b> The video recording feature is problematic in iOS/Android: if the video reaches its end while you're recording it, the underlying `vlckit`/`libvlc` library fails to finalize the recording process, and we cannot retrieve the recorded file.
217+
The issue is reported and tracked here:
218+
<br>
219+
[https://code.videolan.org/videolan/VLCKit/-/issues/394](https://code.videolan.org/videolan/VLCKit/-/issues/394) (see last comment from September 22, 2020)
220+
221+
<hr>
222+
213223
## Current issues
214224
Current issues list [is here](https://github.com/solid-software/flutter_vlc_player/issues).
215225
Found a bug? [Open the issue](https://github.com/solid-software/flutter_vlc_player/issues/new).

flutter_vlc_player/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.0.3
2+
* Added Vlc Recording feature
3+
Credits to Alireza Setayesh (https://github.com/alr2413).
4+
15
## 6.0.2
26
* Fix issue with vlc error event
37
* Added onInit & onRenderer listeners

flutter_vlc_player/README.md

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,36 @@ After that you can access the media/subtitle file by
7373

7474
<hr>
7575

76+
#### Android build configuration
77+
78+
1. In `android/app/build.gradle`:
79+
```groovy
80+
android {
81+
packagingOptions {
82+
// Fixes duplicate libraries build issue,
83+
// when your project uses more than one plugin that depend on C++ libs.
84+
pickFirst 'lib/**/libc++_shared.so'
85+
}
86+
87+
buildTypes {
88+
release {
89+
minifyEnabled true
90+
useProguard true
91+
proguardFiles getDefaultProguardFile(
92+
'proguard-android-optimize.txt'),
93+
'proguard-rules.pro'
94+
}
95+
}
96+
}
97+
```
98+
99+
2. Create `android/app/proguard-rules.pro`, add the following lines:
100+
```proguard
101+
-keep class org.videolan.libvlc.** { *; }
102+
```
103+
104+
<br>
105+
76106
## Quick Start
77107
To start using the plugin, copy this code or follow the example project in 'flutter_vlc_player/example'
78108

@@ -145,11 +175,12 @@ class _MyHomePageState extends State<MyHomePage> {
145175
146176
```
147177

178+
<br>
148179

180+
### Recording feature
181+
To start/stop video recording, you have to call the `startRecording(String saveDirectory)` and `stopRecording()` methods, respectively. By calling the stop method you can get the path of recorded file from `vlcPlayerController.value.recordPath`.
149182

150-
151-
152-
183+
<hr>
153184

154185
## Upgrade instructions
155186

@@ -175,13 +206,21 @@ If you have some changes made to the iOS app, recreate the app using above metho
175206

176207
Be sure to follow instructions above after
177208

178-
<hr>
209+
<br>
179210

180211
### Breaking Changes (from V4 to V5)
181212
Entire platform has been refactored in v5. It will require a refactor of your app to follow v5.
182213

183214
<hr>
184215

216+
## Known Issues
217+
<b>1)</b> The video recording feature is problematic in iOS/Android: if the video reaches its end while you're recording it, the underlying `vlckit`/`libvlc` library fails to finalize the recording process, and we cannot retrieve the recorded file.
218+
The issue is reported and tracked here:
219+
<br>
220+
[https://code.videolan.org/videolan/VLCKit/-/issues/394](https://code.videolan.org/videolan/VLCKit/-/issues/394) (see last comment from September 22, 2020)
221+
222+
<hr>
223+
185224
## Current issues
186225
Current issues list [is here](https://github.com/solid-software/flutter_vlc_player/issues).
187226
Found a bug? [Open the issue](https://github.com/solid-software/flutter_vlc_player/issues/new).
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
include: package:pedantic/analysis_options.yaml
1+
include: package:flutter_lints/flutter.yaml

flutter_vlc_player/android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ buildscript {
88
}
99

1010
dependencies {
11-
classpath 'com.android.tools.build:gradle:4.0.0'
11+
classpath 'com.android.tools.build:gradle:4.1.3'
1212
}
1313
}
1414

@@ -42,5 +42,5 @@ dependencies {
4242
implementation 'org.videolan.android:libvlc-all:3.3.14'
4343
implementation 'androidx.appcompat:appcompat:1.2.0'
4444
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
45-
implementation 'androidx.annotation:annotation:1.1.0'
45+
implementation 'androidx.annotation:annotation:1.2.0'
4646
}

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ final class FlutterVlcPlayer implements PlatformView {
5050
//
5151
private LibVLC libVLC;
5252
private MediaPlayer mediaPlayer;
53-
private List<RendererDiscoverer> rendererDiscoverers = new ArrayList<>();;
54-
private List<RendererItem> rendererItems = new ArrayList<>();;
53+
private List<RendererDiscoverer> rendererDiscoverers = new ArrayList<>();
54+
private List<RendererItem> rendererItems = new ArrayList<>();
5555
private boolean isDisposed = false;
5656

5757
// Platform view
@@ -287,13 +287,19 @@ public void onEvent(MediaPlayer.Event event) {
287287
mediaEventSink.success(eventObject);
288288
break;
289289

290+
case MediaPlayer.Event.RecordChanged:
291+
eventObject.put("event", "recording");
292+
eventObject.put("isRecording", event.getRecording());
293+
eventObject.put("recordPath", event.getRecordPath());
294+
mediaEventSink.success(eventObject);
295+
break;
296+
290297
case MediaPlayer.Event.LengthChanged:
291298
case MediaPlayer.Event.MediaChanged:
292299
case MediaPlayer.Event.ESAdded:
293300
case MediaPlayer.Event.ESDeleted:
294301
case MediaPlayer.Event.ESSelected:
295302
case MediaPlayer.Event.PausableChanged:
296-
case MediaPlayer.Event.RecordChanged:
297303
case MediaPlayer.Event.SeekableChanged:
298304
case MediaPlayer.Event.PositionChanged:
299305
default:
@@ -426,11 +432,8 @@ long getSpuDelay() {
426432
return mediaPlayer.getSpuDelay();
427433
}
428434

429-
void addSubtitleTrack(String url, boolean isNetworkUrl, boolean isSelected) {
430-
if (isNetworkUrl)
431-
mediaPlayer.addSlave(Media.Slave.Type.Subtitle, Uri.parse(url), isSelected);
432-
else
433-
mediaPlayer.addSlave(Media.Slave.Type.Subtitle, url, isSelected);
435+
void addSubtitleTrack(String url, boolean isSelected) {
436+
mediaPlayer.addSlave(Media.Slave.Type.Subtitle, Uri.parse(url), isSelected);
434437
}
435438

436439
int getAudioTracksCount() {
@@ -464,11 +467,8 @@ long getAudioDelay() {
464467
return mediaPlayer.getAudioDelay();
465468
}
466469

467-
void addAudioTrack(String url, boolean isNetworkUrl, boolean isSelected) {
468-
if (isNetworkUrl)
469-
mediaPlayer.addSlave(Media.Slave.Type.Audio, Uri.parse(url), isSelected);
470-
else
471-
mediaPlayer.addSlave(Media.Slave.Type.Audio, url, isSelected);
470+
void addAudioTrack(String url, boolean isSelected) {
471+
mediaPlayer.addSlave(Media.Slave.Type.Audio, Uri.parse(url), isSelected);
472472
}
473473

474474
int getVideoTracksCount() {
@@ -627,6 +627,14 @@ String getSnapshot() {
627627
return Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP);
628628
}
629629

630+
Boolean startRecording(String directory) {
631+
return mediaPlayer.record(directory);
632+
}
633+
634+
Boolean stopRecording() {
635+
return mediaPlayer.record(null);
636+
}
637+
630638
private void log(String message) {
631639
if (debug) {
632640
Log.d(TAG, message);

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayerBuilder.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,7 @@ public Messages.DelayMessage getSpuDelay(Messages.TextureMessage arg) {
252252
@Override
253253
public void addSubtitleTrack(Messages.AddSubtitleMessage arg) {
254254
FlutterVlcPlayer player = vlcPlayers.get(arg.getTextureId());
255-
boolean isNetworkUrl = arg.getType() == DataSourceType.NETWORK.getNumericType();
256-
player.addSubtitleTrack(arg.getUri(), isNetworkUrl, arg.getIsSelected());
255+
player.addSubtitleTrack(arg.getUri(), arg.getIsSelected());
257256
}
258257

259258
@Override
@@ -303,8 +302,7 @@ public Messages.DelayMessage getAudioDelay(Messages.TextureMessage arg) {
303302
@Override
304303
public void addAudioTrack(Messages.AddAudioMessage arg) {
305304
FlutterVlcPlayer player = vlcPlayers.get(arg.getTextureId());
306-
boolean isNetworkUrl = arg.getType() == DataSourceType.NETWORK.getNumericType();
307-
player.addAudioTrack(arg.getUri(), isNetworkUrl, arg.getIsSelected());
305+
player.addAudioTrack(arg.getUri(), arg.getIsSelected());
308306
}
309307

310308
@Override
@@ -399,4 +397,21 @@ public void castToRenderer(Messages.RenderDeviceMessage arg) {
399397
player.castToRenderer(arg.getRendererDevice());
400398
}
401399

400+
@Override
401+
public Messages.BooleanMessage startRecording(Messages.RecordMessage arg) {
402+
FlutterVlcPlayer player = vlcPlayers.get(arg.getTextureId());
403+
Boolean result = player.startRecording(arg.getSaveDirectory());
404+
Messages.BooleanMessage message = new Messages.BooleanMessage();
405+
message.setResult(result);
406+
return message;
407+
}
408+
409+
@Override
410+
public Messages.BooleanMessage stopRecording(Messages.TextureMessage arg) {
411+
FlutterVlcPlayer player = vlcPlayers.get(arg.getTextureId());
412+
Boolean result = player.stopRecording();
413+
Messages.BooleanMessage message = new Messages.BooleanMessage();
414+
message.setResult(result);
415+
return message;
416+
}
402417
}

0 commit comments

Comments
 (0)