rosenbjerg / ffmpegcore Goto Github PK
View Code? Open in Web Editor NEWA .NET FFMpeg/FFProbe wrapper for easily integrating media analysis and conversion into your C# applications
License: MIT License
A .NET FFMpeg/FFProbe wrapper for easily integrating media analysis and conversion into your C# applications
License: MIT License
FFMpegArguments.FromConcatenation is only concatenating the first file.
var videosDirectory = $@"C:\Users\afrom\Source\Repos\kameeyo\Tests\videos\output\";
var files = Directory.EnumerateFiles(videosDirectory).ToArray();
FFMpegArguments
.FromConcatenation(files)
.OverwriteExisting()
.OutputToFile($"{videosDirectory}output.mp4")
.ProcessSynchronously();
Is there any reason why NetStandard 2.1 is needed?
NetStandard 2.1 cannot be consumed from Net Framework 4.71, even Net Framework 4.8 still uses NetStandard 2.0.
From the documentation:
Library authors who need to support .NET Framework customers should stay on .NET Standard 2.0. In fact, most libraries should be able to stay on .NET Standard 2.0, as the API additions are largely for advanced scenarios. However, this doesnβt mean that library authors cannot take advantage of these APIs even if they have to support .NET Framework. In those cases they can use multi-targeting to compile for both .NET Standard 2.0 as well as .NET Standard 2.1. This allows writing code that can expose more features or provide a more efficient implementation on runtimes that support .NET Standard 2.1 while not giving up on the bigger reach that .NET Standard 2.0 offers.
So, could you lower the version requirement to 2.0? or at least, multitarget 2.0 and 2.1?
How about translate it to delphi headers.
Thank you
Hi,
I need to encode live Webcam footage, which has become quite trivial to me and the docs also didn't help :(
`private void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap Video = (Bitmap)eventArgs.Frame.Clone();
_pictureBox.Image = Video;
BitmapVideoFrameWrapper wrapper = new BitmapVideoFrameWrapper((Bitmap)eventArgs.Frame.Clone());
_videoFrames.Add(wrapper);
_ffmpeg.OnProgress += (progress) => Debug.WriteLine("Encode Progress: {0}", progress);
if (_videoFrames.Count == 30)
{
StreamPipeDataReader output = new StreamPipeDataReader(new MemoryStream());
RawVideoPipeDataWriter _rawVideo = new RawVideoPipeDataWriter(CreateFrames(30))
{
FrameRate = 15
};
ArgumentContainer _codecArgs = new ArgumentContainer()
{
new InputPipeArgument(_rawVideo),
new OutputPipeArgument(output)
};
var Result = _ffmpeg.Convert(_codecArgs);
Debug.WriteLine("RESUTL: " + Result.Size);
}
}`
This Action is called when a new Frame arrives from AForgeManager camera.
`private IEnumerable<IVideoFrame> CreateFrames(int count)
{
for (int i = 0; i < count; i++)
{
yield return _videoFrames[i];
}
_videoFrames.Clear();
}
`
This is how the 'docs' in ReadMe implements it and is how is implemented them but sadly no positive result.
I create a List of 'IVideoFrame' and Append every new frame to it then wait for it to reach at least 30 frames then encode them, clear the list and restart the procedure I don't know if this is the right way but any help is appreciated π
I am having an issue attempting to transcode a video in memory. AIl I get for an error is "Pipe is broken". I have tried debugging the project with no luck. I followed the example I found in the tests, but I suspect I am missing something.
Test Followed:
FFMpegCore/FFMpegCore.Test/VideoTest.cs
Line 611 in b8fc8e5
Do I need to inherit from IPipeSink
in order to output properly?
Here is the code I have. I am trying to convert an AVI to MP4 in memory,
var path = @"path_to_my_video.avi";
var input = FFProbe.Analyse(path);
using (FileStream fs = new FileStream(input.Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var output = new MemoryStream())
{
try
{
var pipeSource = new StreamPipeSource(fs);
var arguments = FFMpegArguments.FromPipe(pipeSource)
.WithVideoCodec(VideoCodec.LibX264)
.ForceFormat("mp4");
var processor = arguments.OutputToPipe(new StreamPipeSink(output)); // Doesn't Work
// This Works var processor = arguments.OutputToFile(@"output_test.mp4");
var success = processor.ProcessSynchronously();
}
catch (Exception ex)
{
throw;
}
}
Version: 2.0.1
i'm trying this in a test project. this is your input.mp4 file.
FFMpeg.Join(@"..\..\..\joined_video.mp4",
@"..\..\..\videos\output\input.mp4"
);
this is error I'm getting
FFMpegCore.Exceptions.FFMpegException : Invalid output file. File extension should be '.mpegts' required.
hello
i use your powerful library
but join method have proble two mp4 :
some last frame from first input have repat after join
i use this code :
FFMpeg encoder = new FFMpeg(); VideoInfo vf=encoder.Join( new FileInfo(@"C:\joined_video.mp4"), VideoInfo.FromPath(@"C:\part2.mp4"), VideoInfo.FromPath(@"C:\part2after.mp4") )
please down load and see my joined video from this link :
my joined video
I wan't to display 100 android phones screen.
The phones will send me H264 Annex B NALU arrays.(by header [00 00 00 01 xx xx xx .......])
It can be played directly by ffmpeg but vlc could not.
Question1:
How to enqueue my array datas to ffmpeg? I try named pipe stream, but doesn't work:
// Fault...
VideoInfo.FromPath(@"\\.\pipe\MyName1")
Question2:
How to enqueue All I/B/P NALU array, and return all decode frames? I will use it in WPF app, and draw it by WriteableBitmap
.
public class BitmapDecodeInfo
{
public Size CurSize;
public int Framerate;
public byte[] RgbData { get; internal set; }
}
WriteableBitmap _drawBitmap;
public WriteableBitmap GetWriteableBitmap(BitmapDecodeInfo bitmapInfo, out bool newBitmap)
{
if (_drawBitmap == null
|| _drawBitmap.Width != bitmapInfo.CurSize.Width
|| _drawBitmap.Height != bitmapInfo.CurSize.Height)
{
newBitmap = true;
_drawBitmap = new WriteableBitmap(bitmapInfo.CurSize.Width, bitmapInfo.CurSize.Height, 96, 96, PixelFormats.Bgr24, null);
_drawBitmap.WritePixels(new Int32Rect(0, 0, bitmapInfo.CurSize.Width, bitmapInfo.CurSize.Height),
bitmapInfo.RgbData, _drawBitmap.BackBufferStride, 0);
return _drawBitmap;
}
else
{
newBitmap = false;
_drawBitmap.WritePixels(new Int32Rect(0, 0, bitmapInfo.CurSize.Width, bitmapInfo.CurSize.Height),
bitmapInfo.RgbData, _drawBitmap.BackBufferStride, 0);
return _drawBitmap;
}
}
Version : 2.0.1, installed via nuget
I'm getting this exception message when trying to convert videos piping from and out to MemoryStream. Please see as below:
public byte[] ConvertVideo(Stream inputStream)
{
var arguments = FFMpegArguments
.FromPipe(new StreamPipeSource(inputStream))
.WithVideoCodec(VideoCodec.LibX264)
.Scale(VideoSize.Ld);
using var outputStream = new MemoryStream();
var streamPipeDataReader = new StreamPipeSink(outputStream);
var processor = arguments.OutputToPipe(streamPipeDataReader);
var success = processor.ProcessSynchronously();
return outputStream.ToArray();
}
The exception message is
"FFMpegCore.Exceptions.FFMpegException: 'ffmpeg version git-2020-06-03-b6d7c4c Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9.3.1 (GCC) 20200523
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf
libavutil 56. 49.100 / 56. 49.100
libavcodec 58. 90.100 / 58. 90.100
libavformat 58. 44.100 / 58. 44.100
libavdevice 58. 9.103 / 58. 9.103
libavfilter 7. 84.100 / 7. 84.100
libswscale 5. 6.101 / 5. 6.101
libswresample 3. 6.100 / 3. 6.100
libpostproc 55. 6.100 / 55. 6.100
\.\pipe\FFMpegCore_cae723fa-0c8c-4ec8-8ede-9668006b2432: Invalid data found when processing input'"
How can I fix it? Your help is greatly appreciated!
Regards,
Claire
I Use Ffmpeg For Overlay Png on short video : For Example 5 seconds video I Use This Command :
-i C:\\part1.mp4 -i C:\\txt1.png -filter_complex \"overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2\" -c:v libx264 -pix_fmt yuv420p -codec:a copy C:\\outputtext1.mp4
one seconds freeze in playing ...
please help me
please download and see my output video :
Output Above Command
Hi,
I can't get this lib to work and it seems to be the only one that has what I want.
It crashes like this
Picture
Am I doing something wrong ?
Would be useful to capture some metadata from the ffprobe data.
rotate - is my main need, looks like this shows up on the video stream tags also
creation_time
com.apple.quicktime.make
com.apple.quicktime.model
com.apple.quicktime.software
com.android.version
Hi,
Thanks for the latest update!.
I need info, how to convert mkl to mp4 with FFMpegCore?
many thanks
How to record desktop screen using this lib in windows 7 and 10.
please advise
Can a URL be used as an input file e.g
string inputFile = "https://stewartmstorage.blob.core.windows.net/videos/myVideo.mp4"
to input an Azure storage blob
Apologies if I missed something, but was VideoInfo purposefully removed in version 2.0? If so, could that be noted somewhere in the README?
static void Main(string[] args)
{
FFMpeg encoder = new FFMpeg();
encoder.JoinImageSequence(
new FileInfo(@"..\joined_video.mp4"),
1, // FPS
ImageInfo.FromPath(@"..\1.png"),
ImageInfo.FromPath(@"..\2.png"),
ImageInfo.FromPath(@"..\3.png")
);
}
I need to split the video in to several parts and merge them along with some additional images. How can I do that?
how to add an background image to a phone video?
for example, i have a video that is 7201280 portrait, then i want to convert it to a wide video 1280720, the black part will filled with a background image, how should i do?
Does FFFMpegCore support UWP projects ?
I am trying to snapshot a video on certain timespan using code below:
on code:
Bitmap _bmp = FFMpeg.Snapshot(_video, new Size(200, 400), TimeSpan.FromSeconds(_point));
I need to follow the original video width and height, how to do this?
MemoryStream _ms_mp4 = new MemoryStream(Convert.FromBase64String(_base64_mp4.Substring(_base64_mp4.IndexOf('/') + 1, 4)));
MediaAnalysis _video = await FFProbe.AnalyseAsync(_ms_mp4);
try
{
for (int _i = 1; _i <= _ja_snappoints.Count; _i++)
{
int _point = (int)_ja_snappoints[_i];
Bitmap _bmp = FFMpeg.Snapshot(_video, new Size(200, 400), TimeSpan.FromSeconds(_point));
using (MemoryStream _ms = new MemoryStream())
{
_bmp.Save(_ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string _base64 = "data:image/jpeg;base64," + Convert.ToBase64String(_ms.ToArray());
_lsnapshot.Add(new { snappoint = _point, base64 = _base64 });
}
}
}
i did look at the readme and your test code. i'm not asking about joining videos. given a specific timecode and duration, i have videos i want to grab clips from and i want to concatenate those clips into one video.
Originally posted by @curlyfro in #76 (comment)
Hello guys,
Thank you for making this library possible, I'm experiencing an issue with the Join method, I have some MP4 videos (10 videos) and I'm using the Join method to join them all into a single MP4 file, the MP4 file is good but the audio sometimes cut (matter of some milliseconds of silence between here and there).
It is worth noting that:
Thanks in advance guys, If you want any output or logs feel free to ask, I have no Idea yet what should logs I post.
EDIT
Turns out this problem happens when two videos have a different audio sample rate, if I Join two videos with the same audio sample rate there are no cuts
How to pass the NamedPipeServerStream to the continuous edited picture data through the named pipe
Description:
When trying to get a video info using the VideoInfo
class, for some videos there's a serialization exception being thrown.
Issue:
When trying to get a video info using the VideoInfo
class, for some videos there's a serialization exception being thrown. Some video files work and some don't (I've tested with mp4 files).
Here's the top of the stack trace:
Newtonsoft.Json.JsonSerializationException: Unexpected end when deserializing object. Path 'streams[1].tags.language', line 1, position 3263.
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ThrowUnexpectedEndException(JsonReader reader, JsonContract contract, Object currentObject, String message)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
at FFMpegCore.FFMPEG.FFProbe.ParseVideoInfoInternal(VideoInfo info, String probeOutput)
at FFMpegCore.FFMPEG.FFProbe.ParseVideoInfo(VideoInfo info)
at FFMpegCore.VideoInfo..ctor(FileInfo fileInfo)
at FFMpegCore.VideoInfo..ctor(String path)
I've tried different versions of FFProbe (3.3, 4.1, 4.2) and the issue was still present.
I've done some digging through the source code and I think these changes may be the culprit:
6e67f77#diff-bcce3e7cc6c2eddca6d504ff49fefd25
or
a4c7d87#diff-63a7998600d7b2811c3cce31e1162127
Since it's a recent change, I've downgraded my nuget package reference to 1.0.12
and manged to get the video info just fine for the file I was previously getting serialization issues.
Expected:
Getting the VideoInfo should work as expected as FFProbe seems to get the metadata just fine.
The progress event is not working, when using the convert method with a custom ArgumentContainer.
When using a custom argument you have to create the ArgumentContainer manually.
This forces you to use the corresponding convert function, which breaks the progress event.
It only emits events with the same percentage.
Progress event should work with either convert method.
There is an issue in FFMpegCore/FFMPEG/FFProbe.cs in the method ParseVideoInfo:
The double should be parsed with the CultureInfo.InvariantCulture parameter ,otherwise the value "1204.069522" is parsed as "1204069522" in the CultureInfo context. This obviously leads to incorrect values for the duration.
Simlified code to reproduce:
var duration = TimeSpan.FromSeconds(double.Parse("1204.069522"));
var duration = TimeSpan.FromSeconds(double.Parse("1204.069522", CultureInfo.InvariantCulture));
I am using the library to extract frames from a video file. So the output I am using is frame%06d.jpg
.
However, the RunProcess
method will always check for the existence of the output file, which doesn't exist in the way it expects. In the end, I always get the exception below.
if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0)
throw new FFMpegException(FFMpegExceptionType.Process, string.Join("\n", _instance.ErrorData));
How to set temporary files location?
when using OutputToFile("temp.webm")
, I think overwrite should be default to true.
If it is set to false and file already exists it throws Object Reference set to null
Exception. Which does not help in any way to find the problem. Hope I solve someone's 30 mins :)
Can I use this library to live stream / re-stream videos? How to perform live stream / re-stream like?
It would be great if it could work with asp.net-core to do just that.
thank you so much !!!
hello
thx for your great library
Do you support from draw text ?
thx provide an example
I joined to videos from a phone in portrait mode with a 16:9 aspect ratio and the joined video was changed to landscape mode. What is the best solution for this? use encoder.join then follow that with Convert?
following code:
if (Directory.Exists($"{Options.RootDirectory}{target}"))
{
progName = $"{target}{Path.DirectorySeparatorChar}{progName}";
}
var path = $"{Options.RootDirectory}{Path.DirectorySeparatorChar}{progName}";
should be changed to
if (Directory.Exists($"{Options.RootDirectory}{Path.DirectorySeparatorChar}{target}"))
{
progName = $"{target}{Path.DirectorySeparatorChar}{progName}";
}
var path = $"{Options.RootDirectory}{Path.DirectorySeparatorChar}{progName}";
Hello,
I'm trying to use FFMpegCore to help me determine what movies I have in an MKV container that aren't HEVC. All movies are stored on my home server, and I can access them just fine from any machine on my network. However, when I try to use var video = new VideoInfo(file.FullName); (where file is a FileInfo object) I get an error saying "The system cannot find the file specified". Is there an issue using FFMpegCore to access files over a network?
Terrible documentation, a copyargument uses 90% cpu and takes AGES to complete, progress doesnt report right. Ditching this LIB immediately.
Using params "-c copy -bsf:a aac_adtstoasc" get through a 2gb .ts file in like 10 seconds with regular ffmpeg. It takes a literal eternity even if you use the following with your lib:
public class RealCopyArgument : Argument
{
public override string GetStringValue()
{
return "-c copy -bsf:a aac_adtstoasc";
}
}
string _mp4 = @"D:\Project\PTDigital\PrimeAI\tmp\test.mp4";
MediaAnalysis _video = await FFProbe.AnalyseAsync(@_mp4);
The system cannot find the file specified.
I try to load it as MemoryStream
MediaAnalysis _video = await FFProbe.AnalyseAsync(new MemoryStream(_bytes)); // THIS NEVER ENDING PROCESS
i don't think your prerequisites are accurate. i think this depends on the input codec. I'll run some tests but I don't think your software is gpu enabled.
Originally posted by @curlyfro in #77 (comment)
is there an easy way to concatenate different parts of different videos into one video?
could we get video info from stream/bytes or output result into stream/ bytes?
is there a way to enable GPU acceleration? if not, is it something you're considering?
Example Project, If I use BitmapVideoFrameWrapper
to wrap around my Bitmap Frames and store ~65 Frames i.e. 2 seconds of footage and output to MP4 (to test if the output is correct before directly getting bytes of it) the colors shifts towards blue-ish tint and the output is not great. think this is a bug in BitmapVideoFrameWrapper
but moderators can find out the real cause
var videoInfo = VideoInfo.FromFileInfo(new FileInfo(Path.Combine(basePath, fileName)));
I am using above line of code. The path of my video file is perfect. But this line throws an exception "The system cannot find the file specified"
I am using .netCore 3.0 web app
How to get thumbnail from mp4?
I try C# code below:
var video = FFMpegCore.VideoInfo.FromFileInfo(_mp4_fi);
Bitmap _bmp = encoder.Snapshot(video, outputFile, new Size(video.Height, video.Width), TimeSpan.FromSeconds(_i), false);
but produced image become stretched..
what I missed?
please help
What I'm doing is I am recording my WPF application, saving screenshots of the program to a temp directory. Once we are finished recording, we join all of the saved images in the temp directory to an ImageSequence using FFMPEG.JoinImageSequence
. We get a NullReferenceException when we call JoinImageSequence, which points to the get for IsWorking within FFBase as the root cause.
Here's the call stack.
FFMpegCore.dll!FFMpegCore.FFMPEG.FFBase.IsWorking.get()
FFMpegCore.dll!FFMpegCore.FFMPEG.FFBase.CreateProcess(string args, string processPath, bool rStandardInput, bool rStandardOutput, bool rStandardError)
FFMpegCore.dll!FFMpegCore.FFMPEG.FFMpeg.RunProcess(FFMpegCore.FFMPEG.Argument.ArgumentContainer container, System.IO.FileInfo output)
FFMpegCore.dll!FFMpegCore.FFMPEG.FFMpeg.JoinImageSequence(System.IO.FileInfo output, double frameRate, FFMpegCore.ImageInfo[] images)
I'm not sure but I believe doing
if(Process != null) {
return Process.HasExited
} else {
return false;
}
might be a better solution than what is currently happening, as I think the Process.Id
in Process.GetProcesses().Any(x => x.Id == Process.Id)
in the return statement might be what's causing the problem. I would be happy to do a pull request myself and figure it out if y'all would like.
Hi. How can I enumerate all frames? Frame by frame. There is method Stapshot
, but this method get snapshot by TimeSpan. I need all frames without TimeSpans.
Hi,
So it seems I can generate a PosterWithAudio fine (mp4 appears in folder) , but execution doesn't continue after that point as the BlockUntilFinished() line doesn't return
I've been focusing on web development for a few years now, this project started as a small wrapper I wrote when I was developing some server side encoding routines.
I feel like I don't have the necessary time to maintain and keep this repository in a good shape so if anyone is interested, feel free to leave a comment here.
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.