evrone / flutter_audio Goto Github PK
View Code? Open in Web Editor NEWA Flutter audio-plugin to playing and recording sounds
Home Page: https://evrone.com
License: MIT License
A Flutter audio-plugin to playing and recording sounds
Home Page: https://evrone.com
License: MIT License
Is there a way to manipulate the recorded audio file? (like trimming or reversing the recorded audio file) maybe I can decode the file to raw format do the needed manipulations and encode it back.
any advice?
Migrate of plugin to android X is needed.
https://flutter.dev/docs/development/packages-and-plugins/androidx-compatibility
when i use this plugin ,i get error:
startRecorder error: Exception: MissingPluginException(No implementation found for method startRecorder on channel flutter_sound).
but this example run well
Can you please tell me how to retrieve the file path
Note: C:\Users\Ken\AppData\Roaming\Pub\Cache\hosted\pub.dartlang.org\medcorder_audio-0.0.1\android\src\main\java\co\medcorder\medcorderaudio\MedcorderAudioPlugin.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Note - I did receive a 'fix' from the author, which I haven't tried, but this needs to be addressed at the project/plugin level.
Need milliseconds, thanks
@olegbalbekov @davetoxa @KODerFunk @rimidl @dweekly
As followed: -
2020-09-29 17:10:43.133942+0800 Runner[460:70957] flutter: ══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
2020-09-29 17:10:43.136131+0800 Runner[460:70957] flutter: The following MissingPluginException was thrown while activating platform stream on channel
2020-09-29 17:10:43.136891+0800 Runner[460:70957] flutter: medcorder_audio_events:
2020-09-29 17:10:43.137566+0800 Runner[460:70957] flutter: MissingPluginException(No implementation found for method listen on channel medcorder_audio_events)
2020-09-29 17:10:43.138326+0800 Runner[460:70957] flutter:
2020-09-29 17:10:43.139472+0800 Runner[460:70957] flutter: When the exception was thrown, this was the stack:
2020-09-29 17:10:43.140099+0800 Runner[460:70957] flutter: #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:7)
2020-09-29 17:10:43.141333+0800 Runner[460:70957] flutter: <asynchronous suspension>
2020-09-29 17:10:43.141926+0800 Runner[460:70957] flutter: #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
2020-09-29 17:10:43.142588+0800 Runner[460:70957] flutter: #2 EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:542:29)
2020-09-29 17:10:43.143233+0800 Runner[460:70957] flutter: #3 EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:528:64)
2020-09-29 17:10:43.143830+0800 Runner[460:70957] flutter: #8 new MedcorderAudio (package:medcorder_audio/medcorder_audio.dart:13:43)
2020-09-29 17:10:43.145095+0800 Runner[460:70957] flutter: #9 new _MyAppState (package:medcorder_audio_example/main.dart:16:36)
2020-09-29 17:10:43.145872+0800 Runner[460:70957] flutter: #10 MyApp.createState (package:medcorder_audio_example/main.dart:12:36)
2020-09-29 17:10:43.146718+0800 Runner[460:70957] flutter: #11 new StatefulElement (package:flutter/src/widgets/framework.dart:4635:25)
2020-09-29 17:10:43.147284+0800 Runner[460:70957] flutter: #12 StatefulWidget.createElement (package:flutter/src/widgets/framework.dart:900:38)
2020-09-29 17:10:43.148299+0800 Runner[460:70957] flutter: #13 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3485:40)
2020-09-29 17:10:43.148849+0800 Runner[460:70957] flutter: #14 Element.updateChild (package:flutter/src/widgets/framework.dart:3258:18)
2020-09-29 17:10:43.149674+0800 Runner[460:70957] flutter: #15 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1174:16)
2020-09-29 17:10:43.150215+0800 Runner[460:70957] flutter: #16 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1145:5)
2020-09-29 17:10:43.151075+0800 Runner[460:70957] flutter: #17 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1087:17)
2020-09-29 17:10:43.151647+0800 Runner[460:70957] flutter: #18 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2620:19)
2020-09-29 17:10:43.152824+0800 Runner[460:70957] flutter: #19 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1086:13)
2020-09-29 17:10:43.153408+0800 Runner[460:70957] flutter: #20 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:927:7)
2020-09-29 17:10:43.153945+0800 Runner[460:70957] flutter: #21 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:908:7)
2020-09-29 17:10:43.154469+0800 Runner[460:70957] flutter: (elided 15 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
2020-09-29 17:10:43.155475+0800 Runner[460:70957] flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
2020-09-29 17:10:43.159887+0800 Runner[460:70957] flutter: stopPlay: fail
~``
Is there any plan to migrate this plugin to the latest Android / iOS version?
Can this play from a base64-encoded audio string?
• Flutter version 1.2.1
• Framework revision 8661d8aecd (3 months ago), 2019-02-14 19:19:53 -0800
• Engine revision 3757390fa4
• Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)
I'm getting permissions error. I am testing with example. Here is my manifest file.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.medcorder.medcorderaudioexample">
<!-- The INTERNET permission is required for development. Specifically,
flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="medcorder_audio_example"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Hello author! Where can I set the recorded audio format to mp4 so that both ios and Android can play this file?
Android works ok, but iOS shows this on init
The following MissingPluginException was thrown while activating platform stream on channel medcorder_audio_events:
MissingPluginException(No implementation found for method listen on channel medcorder_audio_events)
When the exception was thrown, this was the stack:
#0 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:319:7)
#1 EventChannel.receiveBroadcastStream. (package:flutter/src/services/platform_channel.dart:517:29)
#3 EventChannel.receiveBroadcastStream. (package:flutter/src/services/platform_channel.dart:503:64)
#8 new MedcorderAudio (package:medcorder_audio/medcorder_audio.dart:13:43)
...
needs to be updated to dart 2 preview.
https://groups.google.com/forum/#!topic/flutter-dev/H8dDhWg_c8I
Integrated https://github.com/evrone/flutter_audio with an app for a few months. Was working until recently. Now throws
2018-05-01 10:17:34.794099-0700 Runner[52813:1608248] flutter: type '(Map<String, dynamic>) => void' is not a subtype of type '(dynamic) => void'
Run your application with flutter run
and attach all the log output.
2018-05-01 10:17:34.627949-0700 Runner[52813:1608279] flutter: Observatory listening on http://127.0.0.1:61887/
2018-05-01 10:17:34.786834-0700 Runner[52813:1608248] flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
2018-05-01 10:17:34.793689-0700 Runner[52813:1608248] flutter: The following assertion was thrown attaching to the render tree:
2018-05-01 10:17:34.794099-0700 Runner[52813:1608248] flutter: type '(Map<String, dynamic>) => void' is not a subtype of type '(dynamic) => void'
2018-05-01 10:17:34.803361-0700 Runner[52813:1608248] flutter:
2018-05-01 10:17:34.803674-0700 Runner[52813:1608248] flutter: Either the assertion indicates an error in the framework itself, or we should provide substantially
2018-05-01 10:17:34.804658-0700 Runner[52813:1608248] flutter: more information in this error message to help you determine and fix the underlying cause.
2018-05-01 10:17:34.804950-0700 Runner[52813:1608248] flutter: In either case, please report this assertion by filing a bug on GitHub:
2018-05-01 10:17:34.805849-0700 Runner[52813:1608248] flutter: https://github.com/flutter/flutter/issues/new
2018-05-01 10:17:34.806535-0700 Runner[52813:1608248] flutter:
2018-05-01 10:17:34.806868-0700 Runner[52813:1608248] flutter: When the exception was thrown, this was the stack:
2018-05-01 10:17:34.811722-0700 Runner[52813:1608248] flutter: #0 new MedcorderAudio (package:medcorder_audio/medcorder_audio.dart:16:50)
2018-05-01 10:17:34.812700-0700 Runner[52813:1608248] flutter: #1 new _MyAppState (file:///Users/jeanpaul/Dev/flutter_audio/example/lib/main.dart:17:36)
2018-05-01 10:17:34.813265-0700 Runner[52813:1608248] flutter: #2 MyApp.createState (file:///Users/jeanpaul/Dev/flutter_audio/example/lib/main.dart:12:36)
2018-05-01 10:17:34.813675-0700 Runner[52813:1608248] flutter: #3 new StatefulElement (package:flutter/src/widgets/framework.dart:3702:23)
2018-05-01 10:17:34.813951-0700 Runner[52813:1608248] flutter: #4 StatefulWidget.createElement (package:flutter/src/widgets/framework.dart:781:42)
2018-05-01 10:17:34.814354-0700 Runner[52813:1608248] flutter: #5 Element.inflateWidget (package:flutter/src/widgets/framework.dart:2897:40)
2018-05-01 10:17:34.814503-0700 Runner[52813:1608248] flutter: #6 Element.updateChild (package:flutter/src/widgets/framework.dart:2702:12)
2018-05-01 10:17:34.815057-0700 Runner[52813:1608248] flutter: #7 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:857:16)
2018-05-01 10:17:34.815264-0700 Runner[52813:1608248] flutter: #8 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:828:5)
2018-05-01 10:17:34.815461-0700 Runner[52813:1608248] flutter: #9 RenderObjectToWidgetAdapter.attachToRenderTree. (package:flutter/src/widgets/binding.dart:774:17)
2018-05-01 10:17:34.815602-0700 Runner[52813:1608248] flutter: #10 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2214:19)
2018-05-01 10:17:34.815924-0700 Runner[52813:1608248] flutter: #11 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:773:13)
2018-05-01 10:17:34.816070-0700 Runner[52813:1608248] flutter: #12 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:662:7)
2018-05-01 10:17:34.816395-0700 Runner[52813:1608248] flutter: #13 runApp (package:flutter/src/widgets/binding.dart:704:7)
2018-05-01 10:17:34.816566-0700 Runner[52813:1608248] flutter: #14 main (file:///Users/jeanpaul/Dev/flutter_audio/example/lib/main.dart:7:3)
2018-05-01 10:17:34.817113-0700 Runner[52813:1608248] flutter: #15 _startIsolate. (dart:isolate/runtime/libisolate_patch.dart:279:19)
2018-05-01 10:17:34.817693-0700 Runner[52813:1608248] flutter: #16 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)
2018-05-01 10:17:34.818300-0700 Runner[52813:1608248] flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
Run flutter analyze
and attach any output of that command also.
144:example jeanpaul$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.3.1, on Mac OS X 10.13.4 17E199, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 9.3)
[✓] Android Studio (version 3.1)
[✓] VS Code (version 1.22.2)
[✓] Connected devices (3 available)
For more information about diagnosing and reporting Flutter bugs, please see https://flutter.io/bug-reports/.
error like this when i try to implement this
Exception in thread "main" java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:225)
at java.util.zip.ZipFile.(ZipFile.java:155)
at java.util.zip.ZipFile.(ZipFile.java:169)
at org.gradle.wrapper.Install.unzip(Install.java:214)
at org.gradle.wrapper.Install.access$600(Install.java:27)
at org.gradle.wrapper.Install$1.call(Install.java:74)
at org.gradle.wrapper.Install$1.call(Install.java:48)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
[!] Gradle threw an error while trying to update itself. Retrying the update...
Exception in thread "main" java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:225)
at java.util.zip.ZipFile.(ZipFile.java:155)
at java.util.zip.ZipFile.(ZipFile.java:169)
at org.gradle.wrapper.Install.unzip(Install.java:214)
at org.gradle.wrapper.Install.access$600(Install.java:27)
at org.gradle.wrapper.Install$1.call(Install.java:74)
at org.gradle.wrapper.Install$1.call(Install.java:48)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
[!] Gradle threw an error while trying to update itself. Retrying the update...
Gradle task assembleDebug failed with exit code 1
I can't get it to run on Android, it constantly shows No Permissions, which is a bit annoying. Can you please look into this ?
Currently the callback is dynamic which can easily lead to errors at runtime instead of at compile time. It also requires the developer using this library to refer to the readme and copy strings into their codebase, instead of letting the type system handle it.
As an example, you could have a AudioCallback. AudioCallback could have an enum of the event type as one field, and T as the event data.
A different way of doing it could be to have individual callback functions, instead of one where the developer needs to check the type. Eg onRecordingStarted(RecordingStarted event)
.
This also goes for other parts of the API. Instead of startPlay
taking a dynamic map, why not leverage the type system and take:
class StartPlayingArgs {
String fileId;
double position;
}
Just when writing that class I already was confused, since in the readme for startPlay
it mentions the params should be Map<String, String>
, but in the table below it mentions position should be a double
. Which is it? Let the type system handle it instead of the readme.
This doesn't even go into the fact that you lose autocomplete if you use dynamic, which also reduces the speed a dev can write code with the library.
I'm trying to play a bit with your plugin but I can't get example running.
Recording seems to be working as I can see feedback with power of microphone,
calling startPlay
method returns FAIL.
I use SDK 27, Flutter: 0.1.5
I/flutter ( 8509): PARAMS{file: 1521839341296, position: 0.0}
E/MethodChannel#medcorder_audio( 8509): Failed to handle method call
E/MethodChannel#medcorder_audio( 8509): java.lang.NullPointerException: context param can not be null.
E/MethodChannel#medcorder_audio( 8509): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1036)
E/MethodChannel#medcorder_audio( 8509): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1003)
E/MethodChannel#medcorder_audio( 8509): at android.media.MediaPlayer.create(MediaPlayer.java:910)
E/MethodChannel#medcorder_audio( 8509): at android.media.MediaPlayer.create(MediaPlayer.java:887)
E/MethodChannel#medcorder_audio( 8509): at android.media.MediaPlayer.create(MediaPlayer.java:866)
E/MethodChannel#medcorder_audio( 8509): at co.medcorder.medcorderaudio.MedcorderAudioPlugin.startPlay(MedcorderAudioPlugin.java:227)
E/MethodChannel#medcorder_audio( 8509): at co.medcorder.medcorderaudio.MedcorderAudioPlugin.onMethodCall(MedcorderAudioPlugin.java:90)
E/MethodChannel#medcorder_audio( 8509): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:191)
E/MethodChannel#medcorder_audio( 8509): at io.flutter.view.FlutterNativeView.handlePlatformMessage(FlutterNativeView.java:133)
E/MethodChannel#medcorder_audio( 8509): at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#medcorder_audio( 8509): at android.os.MessageQueue.next(MessageQueue.java:325)
E/MethodChannel#medcorder_audio( 8509): at android.os.Looper.loop(Looper.java:142)
E/MethodChannel#medcorder_audio( 8509): at android.app.ActivityThread.main(ActivityThread.java:6494)
E/MethodChannel#medcorder_audio( 8509): at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#medcorder_audio( 8509): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
E/MethodChannel#medcorder_audio( 8509): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I/flutter ( 8509): startPlay: fail
Would you be able to help with it?
Many Thanks
# Edit:
I found the issue:
there is context assignment missing in plugin java file MedcorderAudioPlugin.java
You just need to update it so it is:
MedcorderAudioPlugin(Activity _activity) {
this.activity = _activity;
this.context = activity.getApplicationContext();
}
E/ExtMediaPlayer-JNI(29685): env->IsInstanceOf fails
E/MediaPlayer-JNI(29685): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/ExtMediaPlayer-JNI(29685): env->IsInstanceOf fails
E/MediaPlayer-JNI(29685): JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/MethodChannel#medcorder_audio(29685): Failed to handle method call
E/MethodChannel#medcorder_audio(29685): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ContentResolver android.content.Context.getContentResolver()' on a null object reference
E/MethodChannel#medcorder_audio(29685): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:989)
E/MethodChannel#medcorder_audio(29685): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:971)
E/MethodChannel#medcorder_audio(29685): at android.media.MediaPlayer.create(MediaPlayer.java:878)
E/MethodChannel#medcorder_audio(29685): at android.media.MediaPlayer.create(MediaPlayer.java:855)
E/MethodChannel#medcorder_audio(29685): at android.media.MediaPlayer.create(MediaPlayer.java:834)
E/MethodChannel#medcorder_audio(29685): at co.medcorder.medcorderaudio.MedcorderAudioPlugin.startPlay(MedcorderAudioPlugin.java:227)
E/MethodChannel#medcorder_audio(29685): at co.medcorder.medcorderaudio.MedcorderAudioPlugin.onMethodCall(MedcorderAudioPlugin.java:90)
E/MethodChannel#medcorder_audio(29685): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:191)
E/MethodChannel#medcorder_audio(29685): at io.flutter.view.FlutterNativeView.handlePlatformMessage(FlutterNativeView.java:136)
E/MethodChannel#medcorder_audio(29685): at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#medcorder_audio(29685): at android.os.MessageQueue.next(MessageQueue.java:323)
E/MethodChannel#medcorder_audio(29685): at android.os.Looper.loop(Looper.java:142)
E/MethodChannel#medcorder_audio(29685): at android.app.ActivityThread.main(ActivityThread.java:6361)
E/MethodChannel#medcorder_audio(29685): at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#medcorder_audio(29685): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
E/MethodChannel#medcorder_audio(29685): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
I/flutter (29685): startPlay: fail
When the version compatible with Null Safety is expected?
Flutter: ══╡ EXCEPTION CAUGHT BY SERVICES LIBRARY ╞══════════════════════════════════════════════════════════
flutter: The following MissingPluginException was thrown while activating platform stream on channel
flutter: medcorder_audio_events:
flutter: MissingPluginException(No implementation found for method listen on channel medcorder_audio_events)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.