Commit cfd0eb72 by mahaisong

feat:图片转视频、视频加笔刷、倒计时

parent 7f292e55
......@@ -10,6 +10,12 @@ using MediaFoundation.Misc;
using MediaFoundation.Transform;
using TantaCommon;
////通过读取缓存中公有、固定的变量值刷新。读的时候不lock,增长时lock或阻塞队列。不允许丢失。
///或者是Cuncurrent集合,记录当前进入班级的同学ID。可以防止重复。 统计Count即可。
/// +------------------------------------------------------------------------------------------------------------------------------+
/// ¦ TERMS OF USE: MIT License ¦
/// +------------------------------------------------------------------------------------------------------------------------------¦
......@@ -84,7 +90,7 @@ namespace GISportService
/// <history>
/// 01 Nov 18 Cynic - Ported In
/// </history>
public sealed class CanvaWriteText_Sync : TantaMFTBase_Sync
public sealed class Countdown_Signin_Sync : TantaMFTBase_Sync
{
// Format information
private int m_imageWidthInPixels;
......@@ -115,7 +121,7 @@ namespace GISportService
/// <history>
/// 01 Nov 18 Cynic - Ported In
/// </history>
public CanvaWriteText_Sync() : base()
public Countdown_Signin_Sync() : base()
{
// init this now
m_FrameCount = 0;
......@@ -130,7 +136,7 @@ namespace GISportService
/// <history>
/// 01 Nov 18 Cynic - Ported In
/// </history>
~CanvaWriteText_Sync()
~Countdown_Signin_Sync()
{
// DebugMessage("MFTTantaWriteText_Sync Destructor");
......@@ -397,7 +403,7 @@ namespace GISportService
}
// Calculate the image size (including padding)
m_cbImageSize = m_imageHeightInPixels * m_lStrideIfContiguous;//m_lStrideIfContiguous
m_cbImageSize = m_imageHeightInPixels * m_lStrideIfContiguous;
// now perform the initial setup of the fonts we will use to draw the text.
// since this information does not change (without a format change event)
......@@ -479,19 +485,19 @@ namespace GISportService
{
HResult hr = HResult.S_OK;
//// While we accept types that *might* be interlaced, if we actually receive
//// an interlaced sample, reject it.
//if (m_MightBeInterlaced == true)
//{
// int ix;
// While we accept types that *might* be interlaced, if we actually receive
// an interlaced sample, reject it.
if (m_MightBeInterlaced == true)
{
int ix;
// // Returns a bool: true = interlaced, false = progressive
// hr = InputSample.GetUINT32(MFAttributesClsid.MFSampleExtension_Interlaced, out ix);
// if (hr != HResult.S_OK || ix != 0)
// {
// hr = HResult.E_FAIL;
// }
//}
// Returns a bool: true = interlaced, false = progressive
hr = InputSample.GetUINT32(MFAttributesClsid.MFSampleExtension_Interlaced, out ix);
if (hr != HResult.S_OK || ix != 0)
{
hr = HResult.E_FAIL;
}
}
return hr;
}
......@@ -514,11 +520,11 @@ namespace GISportService
HResult hr = HResult.S_OK;
// see if the media type is one of our list of acceptable subtypes
//hr = TantaWMFUtils.CheckMediaType(pmt, MFMediaType.Video, m_MediaSubtypes);
//if (hr != HResult.S_OK)
//{
// throw new Exception("OnCheckMediaType call to TantaWMFUtils.CheckMediaType failed. Err=" + hr.ToString());
//}
hr = TantaWMFUtils.CheckMediaType(pmt, MFMediaType.Video, m_MediaSubtypes);
if (hr != HResult.S_OK)
{
throw new Exception("OnCheckMediaType call to TantaWMFUtils.CheckMediaType failed. Err=" + hr.ToString());
}
// Video must be progressive frames. Set this now
m_MightBeInterlaced = false;
......@@ -633,7 +639,7 @@ namespace GISportService
// you have to copy it about. See the MFTTantaGrayscale_Sync code.
// The strings to display.
string sString1 = "Hello!";
string sString1 = "签到中";
string sString2 = m_FrameCount.ToString();
// A wrapper around the video data.
......@@ -654,12 +660,16 @@ namespace GISportService
g.DrawString(sString1, m_fontOverlay, System.Drawing.Brushes.Red, sLeft, sTop, StringFormat.GenericTypographic);
// Add a frame number in the bottom right using the transparent font created earlier
d = g.MeasureString(sString2, m_transparentFont);
//d = g.MeasureString(sString2, m_transparentFont);
sLeft = (m_imageWidthInPixels - d.Width) - 10.0f;
sTop = (m_imageHeightInPixels - d.Height) - 10.0f;
//sLeft = (m_imageWidthInPixels - d.Width) - 10.0f;
//sTop = (m_imageHeightInPixels - d.Height) - 10.0f;
//g.DrawString(sString2, m_transparentFont, m_transparentBrush, sLeft, sTop, StringFormat.GenericTypographic);
g.DrawString(sString2, m_transparentFont, m_transparentBrush, sLeft, sTop, StringFormat.GenericTypographic);
d = g.MeasureString(sString2, m_fontOverlay);
sLeft = 0;
sTop = 0;
g.DrawString(sString2, m_fontOverlay, System.Drawing.Brushes.Red, sLeft, sTop, StringFormat.GenericTypographic);
}
}
......
......@@ -400,7 +400,7 @@ namespace GISportService
// audioThreadMethodHelper.enumstate = TantaEVRPlayerStateEnum.OpenPending;
// audioThread.Start(audioThreadMethodHelper); ;//构建拓扑 音频流
//}
Thread.Sleep(HEARTBEAT_DELAYTIME);
Thread.Sleep(HEARTBEAT_DELAYTIME*1000);
}
catch (Exception ex)
{
......@@ -856,12 +856,9 @@ namespace GISportService
/// </summary>
/// <returns></returns>
private IMFTransform CreateTransformObjectAccordingToDisplay(string kongjian)
{
if (kongjian== "Signin") return new CanvaWriteText_Sync();
//if (radioButtonMFTGrayscaleAsync.Checked == true) return new MFTTantaGrayscale_Async();
//if (radioButtonMFTWriteText.Checked == true) return new MFTTantaWriteText_Sync(); ;
//if (radioButtonMFTGrayscaleSync.Checked == true) return new MFTTantaGrayscale_Sync();
//if (radioButtonMFTFrameCounter.Checked == true) return new MFTTantaFrameCounter_Sync();
{
if (kongjian== "Signin") return new Countdown_Signin_Sync();
return null;
}
......@@ -1101,7 +1098,7 @@ namespace GISportService
}
}
//VideoTransform = CreateTransformObjectAccordingToDisplay(kongjian);
VideoTransform = CreateTransformObjectAccordingToDisplay(kongjian);
if (VideoTransform != null)
{
// we do have an MFT transform object. Insert it into the topology between the source and output
......@@ -1113,7 +1110,7 @@ namespace GISportService
{
throw new Exception("OpenVideoFileAndPrepareSessionAndPlay call to MFExtern.MFCreateTopologyNode failed. Err=" + hr.ToString());
}
// set the transform object (it is an IMFTransform) as an object on the transform node. Since it is already there
// the topology does not need a GUID or activator to create it
hr = tmpTransformNode.SetObject(VideoTransform);
......@@ -1200,6 +1197,7 @@ namespace GISportService
throw new Exception("OpenVideoFileAndPrepareSessionAndPlay call to sourceVideoNode.ConnectOutput failed. Err=" + hr.ToString());
}
}
if (type == 2)//视频
{
......@@ -1258,6 +1256,10 @@ namespace GISportService
{
Marshal.ReleaseComObject(sourceVideoNode);
}
if (VideoTransformNode != null)
{
Marshal.ReleaseComObject(VideoTransformNode);
}
if (outputSinkNodeVideo != null)
{
Marshal.ReleaseComObject(outputSinkNodeVideo);
......
......@@ -160,7 +160,7 @@
<Compile Include="FilePlayer.Designer.cs">
<DependentUpon>FilePlayer.cs</DependentUpon>
</Compile>
<Compile Include="CanvaWriteText_Sync.cs" />
<Compile Include="Control\Countdown_Signin_Sync.cs" />
<Compile Include="PlayDemo.cs">
<SubType>Form</SubType>
</Compile>
......
......@@ -122,6 +122,7 @@ namespace GISportService
FilePlayer1.InitMediaPlayer();
//加载命令服务
RemotingServer.getInstance(FilePlayer1);
}
public void PlayerStateChangedEventHandler(object sender, TantaEVRPlayerStateEnum playerState)
{
......
......@@ -46,12 +46,17 @@ namespace GISportService
////-pix_fmt format set pixel format, 'list' as argument shows all the pixel formats supported yuv420p
////-vcodec codec 强制使用codec编解码方式('copy' to copy stream)
////-b bitrate 设置比特率,缺省200kb/s
/// -an 不处理音频
////-s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
////ffmpeg中采用H264,H265标准编码时,可能需要设置preset、
////转码-crf在优先保证画面质量(也不太在乎转码时间)的情况下,使用 - crf参数来控制转码是比较适宜的。这个参数的取值范围为0~51,其中0为无损模式,数值越大,画质越差,生成的文件却越小。从主观上讲,18~28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当。
////-vframes number 设置转换多少桢(frame)的视频
////-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
//string test2 = " -r 25 -loop 1 -i D:/GISports/img/f6ed67ae-02a4-46fd-8fcb-7944918b5c27.jpg -pix_fmt yuv420p -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -s 720x576 -r 25 -t 20 D:/GISports/img/h.mp4";
///主要参数: -i 设定输入流 -f 设定输出格式 -ss 开始时间 视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
///音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频
/////-r 提取图像的频率,-ss 开始时间,-t 持续时间
/////-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
//string test2 = " -r 25 -loop 1 -i D:/GISports/img/f6ed67ae-02a4-46fd-8fcb-7944918b5c27.jpg -pix_fmt yuv420p -vcodec mpeg4 -b:v 600k -r:v 25 -preset medium -crf 30 -s 720x576 -r 25 -t 20 D:/GISports/img/h.mp4";
//string message = Processor.Execute(true, test2);
string configinputPath = "D:/GISports";
......@@ -128,7 +133,7 @@ namespace GISportService
string input = configinputPath + viewmodel.RPath;
string output = configOutputPath + viewmodel.VID + ".mp4";//固定转换
string goffmpeg = " -r 25 -loop 1 -i " + input + " -pix_fmt yuv420p -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -s 720x576 -r 25 -t " + sec + " " + output + "";
string goffmpeg = " -r 25 -loop 1 -i " + input + " -pix_fmt yuv420p -vcodec mpeg4 -b:v 600k -r:v 25 -preset medium -crf 30 -s 1920x1080 -r 25 -t " + sec + " " + output + "";
string message = Processor.Execute(true, goffmpeg);
}
}
......
条件编译:
在demo下会对制定的图片资源编译成视频。--已测试正常, 准备给前端PC配置资源时使用,自动将图片资源+时长,转换出同长的视频。
在Debug下会打印每个资源具体播放时间。--已测试完全相等于数据库配置
\ No newline at end of file
在demo下会对制定的图片资源编译成视频。--已测试正常, 准备给前端PC配置资源时使用(方法是Program中图片转视频的方法、路径),自动将图片资源+时长,转换出同长的视频。
在Debug下会打印每个资源具体播放时间。--已测试完全相等于数据库配置
singin 等倒计时定制控件,是实时的对每一个帧进行重写,背景视频时不断重新播放的。
预期:
1.篮球背景图,需要有课程介绍。
从数据库抽出文字,进行绘制。但是字体和位置都是固定的。所以数量一定不能多。
如果有特殊需要,在某个位置播放图片或视频,则需要再叠加处理。
2.课程结束图,需要刷新课程统计结果。一次统计,不断刷新展示。
还可能的更改:
canvas绘制时,使用真的图片覆盖,指定时长。 但是可能无法输出到Device,只能让显示屏显示 电脑屏幕。
现在把图片编译成视频,可以直接输出到 输出信号Device。
......@@ -20,6 +20,12 @@
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Configuration" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
......
2018-12-27 09:53:39,547 [1] ERROR EFCoreInitConfig.Config [(null)] - 数据库配置项,约定枚举中不存在GISportsModels,临时以key value 方式加载。 :
2018-12-27 09:54:28,825 [1] ERROR EFCoreInitConfig.Config [(null)] - 数据库配置项,约定枚举中不存在GISportsModels,临时以key value 方式加载。 :
2018-12-27 09:59:27,943 [1] ERROR EFCoreInitConfig.Config [(null)] - 数据库配置项,约定枚举中不存在GISportsModels,临时以key value 方式加载。 :
......@@ -379,3 +379,33 @@
12/19/2018 17:28:38 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 10:29:43 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 10:29:43 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:27:19 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:27:19 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:31:33 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:31:33 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:32:14 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:32:14 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:34:20 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:34:20 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:41:38 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:41:38 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:49:25 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:49:25 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:50:58 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:50:58 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:51:50 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:51:50 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:54:05 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 19:54:05 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:06:36 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:06:36 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:09:35 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:09:35 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:10:19 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/26/2018 20:10:19 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:53:42 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:53:42 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:54:30 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:54:30 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:59:30 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
12/27/2018 09:59:30 GISportService.FilePlayer: ctlTantaEVRFilePlayer_SizeChanged
04d09ba3a62e423f871626c2be5a51544ddc4799
5e066b49f313cb287086e2f3aea16f50dcdb0237
......@@ -20,6 +20,12 @@
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Configuration" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
</dependentAssembly>
</assemblyBinding>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
......
......@@ -10,7 +10,7 @@
"DataHistoryModel": "server=castle.gimind.com;port=3306;user=palas;password=lapas;database=debit_quote;Character Set=utf8",
"GIClientModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=gi_client_db",
"iTraderModels": "server=mech.gimind.com;port=3306;user=palas;password=lapas;database=iTrader;Character Set=utf8",
"PalasEntityModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8",
"PalasEntityModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8;Convert Zero Datetime=True;",
"PalasToolModels": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_tools;Character Set=utf8",
"PalasV5Model": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8;Convert Zero Datetime=True",
"QuantModels": "server=mech.gimind.com;port=3306;user=palas;password=lapas;database=quant;Character Set=utf8",
......
......@@ -10,7 +10,7 @@
"DataHistoryModel": "server=castle.gimind.com;port=3306;user=palas;password=lapas;database=debit_quote;Character Set=utf8",
"GIClientModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=gi_client_db",
"iTraderModels": "server=mech.gimind.com;port=3306;user=palas;password=lapas;database=iTrader;Character Set=utf8",
"PalasEntityModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8",
"PalasEntityModel": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8;Convert Zero Datetime=True;",
"PalasToolModels": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_tools;Character Set=utf8",
"PalasV5Model": "server=earth.gimind.com;port=3306;user=palas;password=lapas;database=Palas_V5;Character Set=utf8;Convert Zero Datetime=True",
"QuantModels": "server=mech.gimind.com;port=3306;user=palas;password=lapas;database=quant;Character Set=utf8",
......
2e41c132fb42461739007e685dc7d9f4d172a249
e7fe85f558a5b3d9e39924b5b0c1eb43dd81846f
08ad95eab05dc161443b61c80eee0573add283ea
8b9f9a2fde07d017209b9cc3fef4cad22d363281
{
"version": 1,
"dgSpecHash": "ovb2V2YDxPhB+HP5K3Jhj+Io+CMuomc1nFpgLjgd9jN/YBv2mpSSqFV4XJFcr2XIklf+GoOFBbYR+w9pDBGzlg==",
"dgSpecHash": "3qOagf7Mfw5w69TCL2IZwehg2xOn9t+ihm3MP8h5vD0aLGnyITBUVJ33RDH9yY4+H+Bb47j0xfiA9amZWmzbyA==",
"success": true
}
\ No newline at end of file
......@@ -8,6 +8,6 @@
<Import Project="$(NuGetPackageRoot)microsoft.netcore.app\2.0.0\build\netcoreapp2.0\Microsoft.NETCore.App.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.netcore.app\2.0.0\build\netcoreapp2.0\Microsoft.NETCore.App.targets')" />
</ImportGroup>
<ImportGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="$(NuGetPackageRoot)netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('$(NuGetPackageRoot)netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
</ImportGroup>
</Project>
\ No newline at end of file
f37cf9ea1f1354cae1808f2e21b0b2e7c25de1c4
5d5fbdf547d1ca398b66b42f8fb2035f3451c269
ba5d00ca067d3da9d7717c42c572fe2303685f64
17451b1d51dabf0dcd54cbba1702b6591b087443
9daa1a392a050f1f5480363f84cb18bb41300edd
caa8bde33db355c83d48df9a75543ea89f3cd92a
......@@ -11,6 +11,7 @@ D:\Tanta-master\OISCommon\obj\Debug\OISCommon.dll
D:\Tanta-master\OISCommon\obj\Debug\OISCommon.pdb
D:\smallproject\28.GISports\OISCommon\bin\Debug\OISCommon.dll
D:\smallproject\28.GISports\OISCommon\bin\Debug\OISCommon.pdb
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.csprojAssemblyReference.cache
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.ctlOISBase.resources
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.frmOISBase.resources
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.frmOISLoggerException.resources
......@@ -19,4 +20,3 @@ D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.csproj.GenerateResourc
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.csproj.CoreCompileInputs.cache
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.dll
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.pdb
D:\smallproject\28.GISports\OISCommon\obj\Debug\OISCommon.csprojAssemblyReference.cache
5c5531ff56066e6cd884dc427442977f9bfcc540
29e64b3112779cbfc81f8fb982eaa58f0759e473
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment