ãã®åé¡ã®è§£æ±ºã«åºã¥ããŠããããªãã£ããã£ã«é¢ããèšäºãæžããçµéšãå ±æãããšããã¢ã€ãã¢ãçãŸããŸããã ãã®æ å ±ã¯èª°ãã«åœ¹ç«ã€ãããããŸããã 誰ãæ°ã«ãã-ç§ã¯ç«ããé¡ãããŸãã
åºæã®ä»£ããã«ã
MediaFoundationã¯ãã®ãããªã¿ã¹ã¯ãå®è¡ããããã«ãŸããŸã䜿çšãããŠããŸããããã®ãã©ãããã©ãŒã ã¯ãMicrosoftã8æ¥ããæ°ããããŒãžã§ã³ã®Windowsã§DirectShowã®äœ¿çšãšãµããŒããåŸã ã«æŸæ£ãããšããäºå®ãèæ ®ããŠãããŸã åºãæ®åããŠããŸããã OpenCVãAForgeãªã©ããããªé²ç»ããµããŒãããããŸããŸãªã³ã³ãã¥ãŒã¿ãŒããžã§ã³ã©ã€ãã©ãªããããŸãããåçŽãªãããªãã£ããã£ã§ã¯ã匷åãªåŠçæ©èœã¯ããã»ã©å¿ èŠã§ã¯ãªãããã®ãããªã©ã€ãã©ãªå ã§ã¯å€ãã®å ŽåDirectShowã䜿çšã§ããŸãã
ã€ã³ã¿ãŒãããã«ã¯DirectShowã®æŠèŠãšãã®ä»çµã¿ã«ã€ããŠã®èšäºãè³æãããªãããã ãã®èšäºã®æ å ±ã¯Habréã«æ²èŒãããŠããŸããããã®ãããç§èªèº«ãç¥ããªãçšèªãèªç€ºããªãããã«ããŸãããããŸã§Directshowã«æ £ããŠããªã人ãCïŒã§ãããªé²ç»ã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ãéå§ããå Žæãšç§»åããå Žæãããã³çŽé¢ããªããã°ãªããªãåé¡ã«ã€ããŠè©±ãæ¹æ³ã
ãã®èšäºã®äŸïŒ GitHubã®ã³ãŒããåç § ïŒã§ã¯ãåçŽãªusbãã£ããã£ã«ãŒãEasyCapã䜿çšããŸãã
1.ã©ãããå§ãããã èŠä»¶ãããŒã«ãããã³æ å ±
å¿ èŠãªããŒã«ã¯æ¬¡ã®ãšããã§ãã
1ïŒ K-Lite Codec Pack Megaããã³GraphStudioããŒã«-ãããªãã£ããã£ã°ã©ãã®ã©ããããããã¿ã€ãã³ã°çšã
2ïŒ GraphEditPlus -GraphStudioã®åçšã¢ããã°ã§ãã³ãŒããçæã§ããŸãã C ++ããã³CïŒã§èšèšãããã°ã©ãã 30æ¥éã®è©Šçšçãå©çšã§ããŸããããã®å¶éã¯ãçæãããã³ãŒããã¯ãªããããŒãã«ã³ããŒã§ããªãããšã§ãã
3ïŒCïŒéçºç°å¢-ç§ã®å Žåã¯Visual Studio 12ã§ãã
4ïŒ DirectShow.netã©ã€ãã©ãªã
5ïŒ Windows MediaLibã©ã€ãã©ãªã
æ®å¿µãªãããã€ã³ã¿ãŒãããäžã§ãããªé²ç»ã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ã«é¢ããå®å šã§æ§é åãããã¬ã€ããèŠã€ããããšã¯ã§ããŸããã§ããããããã€ãã®ããŒãžã¯ãŸã第äžã«ãéåžžã«è²Žéãªãã«ããæäŸããŸããã
1ïŒæ å ±ãããã»ã¹å šäœã®è§Šåªãšãªã£ãŠããå°ããªããŒãž ã ãŸããDirectShow.netã®ã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ã®æ確ãªèª¬æãèŠã€ããããšãã§ããŸãã éåžžã«äŸ¿å©ãªããŒãžã§ãããèè ã«æè¬ããŸãã
2ïŒ ãã®ãããªãªãŒãã³ãœãŒã¹ã³ãŒãã¯ãã¯ãã¹ããŒããã®ä»ã®åé¡ã«å¯ŸåŠããã®ã«åœ¹ç«ã¡ãŸããã
3ïŒMSDNãDirectShowããã°ã©ãã³ã°å°çšã®ã»ã¯ã·ã§ã³ããããŸãã
2.ãã£ã«ã¿ãŒããããªã°ã©ãäœæãããžã¥ã¢ã«ãšãã£ã¿ãŒ
DirectShowã°ã©ãã¯ãå ¥åãã³ãšåºåãã³ã«ãã£ãŠäºãã«æ¥ç¶ããããã£ã«ã¿ãŒããæ§ç¯ãããŸãã
ããã«ã€ããŠã®è©³çŽ°ã¯ãã¡ãã§ãã
GraphStudioã®æãåçŽãªã±ãŒã¹ã§ã¯ãããšãã°ãçµ±åãããªã«ã¡ã©ã®ã°ã©ãã次ã®ããã«äœæã§ããŸãã
ãã ãããã®ã¿ã¹ã¯ã«ã¯ããã€ãã®ãã£ã«ã¿ãŒãå¿ èŠã§ãããçµæãšããŠïŒWMV圢åŒã®ãšã³ããªãèæ ®ããïŒã°ã©ãã¯æ¬¡ã®ããã«ãªããŸãã
ãã®ã°ã©ãã«ã¯ãã£ã«ã¿ãŒããããŸãïŒ
SMI Grabber Device ïŒãã£ã«ã¿ãŒã°ã«ãŒã-WDM Streaming Capture DevicesïŒ-ãã£ããã£ãŒããã€ã¹ã§ãããã£ã«ã¿ãŒããããããããªïŒããã³ãªãŒãã£ãªïŒã¹ããªãŒã ãåä¿¡ããŸãã ãã ãããã®å Žåããã£ããã£ããã€ã¹ããã®ãªãŒãã£ãªã¹ããªãŒã ã§ã¯ãªãããã€ã¯ããã®ã¹ããªãŒã ãèšé²ãããŸãïŒ[ãªãŒãã£ãªãã£ããã£ãœãŒã¹]ã°ã«ãŒãã®[ ãã€ã¯...]ããã£ã«ã¿ãŒããŸãïŒã
SM BDAã¯ãã¹ããŒãã£ã«ã¿ãŒã¯ããã£ããã£ããã€ã¹çšã®ã¯ãã¹ããŒãã£ã«ã¿ãŒã§ãããSVideoå ¥åãŸãã¯ã³ã³ããžããå ¥åã®ã©ã¡ãããã®å ¥åä¿¡å·ã®åãæ¿ãã決å®ããèšå®ã§ãã
Smart Tee -2ã€ã®åºåãæã€ã¹ããªãŒã ã¹ããªãã¿ãŒãCaptureåºåããã®ã¹ããªãŒã ããã¡ã€ã«ã«æžã蟌ãŸããŸãã
ãã¬ãã¥ãŒåºåããã®ã¹ããªãŒã ã¯ã AVI Decompressorãã£ã«ã¿ãŒãä»ããŠãã¬ãã¥ãŒãŠã£ã³ããŠã«éãããŸãã ãã§ãŒã³ã
AVI Decompressor-> Video Rendererã¯ãPreview-> Render Pinãªãã·ã§ã³ãéžæãããšèªåçã«äœæãããŸãã
ïŒäœè«ã§ãããã¬ã³ãã©ãŒãã£ã«ã¿ãŒã«ã¯ããŸããŸãªçš®é¡ããããæãé«åºŠãªãã®ã®1ã€ã¯æ¡åŒµãããªã¬ã³ãã©ãŒã§ããããã®äŸã§ã¯ããã©ã«ãã§éåžžã®ãã£ã«ã¿ãŒã䜿çšãããŠããŸãïŒ
WM ASF Writerã¯ãå¿ èŠãªå質ã®ãããªãã¡ã€ã«ãWMV圢åŒã§èšé²ããããã®æãç°¡åãªãªãã·ã§ã³ãæäŸãããã£ã«ã¿ãŒã§ãã åæã«ããŠãŒã¶ãŒã®å質ãå«ããŠãèšé²å質ãå€æŽããããšãã§ããŸãã
ãã®ã°ã©ããå®è¡ãããšããããªãœãŒã¹ã¬ã³ãŒãã®æ£ç¢ºæ§ã確èªã§ããŸãã
3. DirectShow.netã©ã€ãã©ãªãšã°ã©ãã®ã³ãŒããžã®å€æ
3.1ã GraphEditPlusã§ã®ã³ãŒãçæ
次ã®ã¹ãããã¯ãçµæã®ã°ã©ããã³ãŒãã«å€æããããšã§ãã GraphEditPlusããŒã«ã¯ããã®åé¡ã«é¢ããŠéåžžã«è²Žéãªæ¯æŽãæäŸããŸãã äžè¬ã«ããã®ã°ã©ããšãã£ã¿ãŒã¯K-Liteãã³ãã«ã®GraphStudioããã䟿å©ã§ããããã®æãéèŠãªæ©èœã¯ãæ§ç¯ãããã°ã©ãããã³ãŒããçæããæ©èœã§ãã
æ®å¿µãªãã ããã®ããŒã«ã¯ ãCrossbarãWM ASF Writerãªã©ã®ç¹å®ã®ãã£ã«ã¿ãŒã®ã»ããã¢ããã³ãŒããã«ã¹ã¿ãã€ãºã§ããŸããããæåã®ã¹ããããšããŠéåžžã«è²Žéã§ãã
3.2ã ãããªã¢ããªã±ãŒã·ã§ã³
ç¹°ãè¿ããŸããããã®èšäºã®ããã«ç¹å¥ã«æžãããç°¡åãªã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã¯ã ããã§è¡šç€ºããã³ããŠã³ããŒãã§ããŸã ããã¯åãªããã¹ãã±ãŒã¹ã§ããããããã®éæé©æ§ãšSOLIDéåã«ã€ããŠäºåã«è¬çœªããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã°ã©ãã®äž»ãªæäœïŒäœæãç Žæ£ããã³ã®æ€çŽ¢ãã¯ãã¹ããŒã«ãŒãã£ã³ã°ãéå§ãåæ¢ãªã©ïŒã¯æœè±¡VideoCapturebaseã¯ã©ã¹ã§å®çŸ©ããã VideoCapturePreview ã VideoCaptureAsfRecordãŸãã¯VideoCaptureScreenshotsãªã©ã®åŸç¶ã¯ã©ã¹ã¯
BuildGraph()
ãã£ã«ã¿ãŒããã°ã©ããæ§ç¯ããããã®æœè±¡ã¡ãœãããå®è£ ããŸã
BuildGraph()
ãã§ãŒã³ã«æ°ãããã£ã«ã¿ãŒãè¿œå ããŸãã ControlVideoCommonã¯ã©ã¹ã«ã¯ããŠã£ã³ããŠãäœæããŠã°ã©ãããã€ã³ãããæäœãã°ã©ããåæ¢ããã³ç Žæ£ããæäœãããã³ãã®ä»ã®å®çšçãªæäœãå«ãŸããŠããŸãã
3.3ã å¿ ãããæãããªç¹ã§ã¯ãªã
3.3.1ã ããã€ã¹ãè¿œå ãã
åãã¿ã€ãã®ããã€ã¹ãè€æ°ããå ŽåïŒããšãã°ãè€æ°ã®åäžã®ãã£ããã£ã«ãŒãïŒã
ãã®åŸããããã¯åãGUIDãæã¡ãŸãããç°ãªãDisplayNameãã©ã¡ãŒã¿ãŒãæã¡ãŸãã ãã®å Žåã次ã®ã³ãŒãã䜿çšããŠãã¹ãŠã®ããã€ã¹ãèŠã€ããå¿ èŠããããŸãã
private readonly List<DsDevice> _captures = new List<DsDevice>(); //... //search for devices foreach (var device in DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)) { if (device.Name.ToLower().Contains(deviceNamePart.ToLower()) { _captures.Add(device); } } //full device paths that differ var devicePath1 = _captures[0].DevicePath; var devicePath2 = _captures[1].DevicePath; //...
ããã«ãã°ã©ããäœæãããšãããã®ã¡ãœããã§ååŸãã
devicePath1
ããã³
devicePath2
ã¯ãã§ã«äœ¿çšãããŠããŸãã
3.3.2ã ã¯ãã¹ããŒã«ãŒãã£ã³ã°
ãããªãã£ããã£ããã€ã¹ã«ã¯ãããŸããŸãªçš®é¡ã®ãããªå ¥åã䜿çšããããã®ã¯ãã¹ããŒãããå Žåãšãªãå ŽåããããŸãïŒããšãã°ããã®äŸã®AverMediaãšEasyCapã«ã¯ãããŸãããçµã¿èŸŒã¿ã®Webã«ã¡ã©ãŸãã¯BlackMagicãã£ããã£ã«ãŒãã«ã¯ãããŸããïŒã ãããã£ãŠãã¯ãã¹ããŒãžã®ãã€ã³ãã¯èªåã§ããå¿ èŠããããŸãã
ãã®ãããã¡ãœããã¯åºæ¬ã¯ã©ã¹ã§å®çŸ©ãããŸã
FixCrossbarRouting(ref IBaseFilter captureFilter, PhysicalConnectorType? physicalConnectorType)
ãã¯ãã¹ããŒïŒååšããå ŽåïŒãæ€çŽ¢ããŠæ¥ç¶ããå¿ èŠãªå ¥åã¿ã€ãã«åãæ¿ããŸãã
/// <summary> /// Configure crossbar inputs and connect crossbar to input device /// </summary> /// <param name="captureFilter">Filter to find and connect crossbar for</param> /// <param name="physicalConnectorType">crossbar connector type to be used</param> /// <returns></returns> protected int FixCrossbarRouting(ref IBaseFilter captureFilter, PhysicalConnectorType? physicalConnectorType) { object obj = null; //fixing crossbar routing int hr = CaptureGraphBuilder.FindInterface(FindDirection.UpstreamOnly, null, captureFilter, typeof(DirectShowLib.IAMCrossbar).GUID, out obj); if (hr == 0 && obj != null) { //found something, check if it is a crossbar var crossbar = obj as IAMCrossbar; if (crossbar == null) throw new Exception("Crossbar object has not been created"); int numOutPin; int numInPin; crossbar.get_PinCounts(out numOutPin, out numInPin); //for all output pins for (int iOut = 0; iOut < numOutPin; iOut++) { int pinIndexRelatedOut; PhysicalConnectorType physicalConnectorTypeOut; crossbar.get_CrossbarPinInfo(false, iOut, out pinIndexRelatedOut, out physicalConnectorTypeOut); //for all input pins for (int iIn = 0; iIn < numInPin; iIn++) { // check if we can make a connection between the input pin -> output pin hr = crossbar.CanRoute(iOut, iIn); if (hr == 0) { //it is possible, get input pin info int pinIndexRelatedIn; PhysicalConnectorType physicalConnectorTypeIn; crossbar.get_CrossbarPinInfo(true, iIn, out pinIndexRelatedIn, out physicalConnectorTypeIn); //bool indication if current input oin can be connected to output pin bool canRoute = physicalConnectorTypeIn == physicalConnectorType; //get video from composite channel (CVBS) //should output pin be connected to current input pin if (canRoute) { //connect input pin to output pin hr = crossbar.Route(iOut, iIn); if (hr != 0) throw new Exception("Output and input pins cannot be connected"); } } //if(hr==0) } //for(iIn...) } //for(iOut...) } //if(hr==0 && obj!=null) return hr; }
3.3.3ã ãªãœãŒã¹ã®ãªãªãŒã¹
äœæãããã°ã©ããç Žæ£ããããšãã«ãªãœãŒã¹ã解æŸããªãå Žåãæåã®ã€ã³ã¹ã¿ã³ã¹ãšåããã£ã«ã¿ãŒã䜿çšããŠã°ã©ãã®å¥ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšå€±æããããã
DisposeFilters()
ã¡ãœãããåŒã³åºããŠããã£ã«ã¿ãŒãç Žæ£ãããã°ã©ãããåé€ããå¿ èŠããããŸãã ããã€ãã®å®éšã®åŸã次ã®ã³ãŒãã¯æ£åžžã«æ©èœããŸããã
if (Graph == null) return; IEnumFilters ef; var f = new IBaseFilter[1]; int hr = Graph.EnumFilters(out ef); if (hr == 0) { while (0 == ef.Next(1, f, IntPtr.Zero)) { Graph.RemoveFilter(f[0]); ef.Reset(); } } Graph = null;
3.3.4ã ã¹ããªãŒã æ§æïŒãã¬ãŒã ã¬ãŒãã解å床ãªã©ïŒ
ãããªãã£ããã£ããã€ã¹ã¯ãç°ãªããããªã¹ããªãŒã æ§æãçæã§ãããããã®éã§åãæ¿ããããšãã§ããŸãã ããšãã°ãhdã«ã¡ã©ã¯ãæ¯ç§60ãã¬ãŒã ã§640 x 480ã®ç»åãšãæ¯ç§30ãã¬ãŒã ã®ãã¬ãŒã ã¬ãŒãã§hdå質ã®ç»åã®äž¡æ¹ãçæã§ããŸãã ãã¬ãŒã ã¬ãŒãã®å Žåã29.97ãã¬ãŒã /ç§ã®ãããªå°æ°æ¡ããããŸãã ãã®ãããªãã©ã¡ãŒã¿ãŒãæ§æããã«ã¯ã
FindInterface
ã€ã³ã¿ãŒãã§ã€ã¹ã®
FindInterface
ã¡ãœããã䜿çšããŠ
streamConfigObject
ãªããžã§ã¯ããäœæãã
IAMStreamConfig
ã€ã³ã¿ãŒãã§ã€ã¹ã«ç§»åãã
GetFormat
ã¡ãœãããåŒã³åºããŠ
GetFormat
åã®ãªããžã§ã¯ããååŸããããããŒãååŸããå¿ èŠããããŸãã
var infoHeader = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
ãã®ãã©ã¡ãŒã¿ãŒã§æäœãå®è¡ãç¶ãã
AvgTimePerFrame,
BmiHeader.Width,
BmiHeader.Height
ãã®ä»ã
ããã¯ã
VideoCaptureAsfRecord
ã¯ã©ã¹ã®
ConfigureResolution
ããã³
ConfigureFramerate
ã¡ãœããã®ã³ãŒãã§ç¢ºèªã§ããŸãã
3.3.5ã ã¹ã¯ãªãŒã³ã·ã§ãã
ãããªã¹ããªãŒã ããã¹ã¯ãªãŒã³ã·ã§ãããååŸããã«ã¯ãã°ã©ãïŒVideoCaptureScreenshotsïŒã
ISampleGrabberCB
ããæ§ç¯ãããã¯ã©ã¹ãç¶æ¿ãã2ã€ã®ã¡ãœãã
BufferCB
ãš
SampleCB
ãåå®çŸ©ãã
BufferCB
ãã
SampleCB
ã
SampleCB
ã¯ç©ºã®å Žåãããã
BufferCB
çµæã®é å
BufferCB
ã³ããŒããŸãã
if ((pBuffer != IntPtr.Zero) && (bufferLen > 1000) && (bufferLen <= _savedArray.Length)) { Marshal.Copy(pBuffer, _savedArray, 0, bufferLen); }
ãã³ãã©ãŒãåŒã³åºãã ãã§ãªãïŒ
_invokerControl.BeginInvoke(new CaptureDone(OnCaptureDone))
ã¡ãœãããåŒã³åºãå Žæ
SetCallback
SamlpleGrabber
'a
_iSampleGrabber.SetCallback(null, 0);
BuildGraph
ã¡ãœããã§ã¯ããã§ãŒã³å ã®
SampleGrabber
ãã£ã«ã¿ãŒããªã³ã«ãã
BuildGraph
ããããæ§æããä»ã®ãã£ã«ã¿ãŒãè¿œå ããåŸã«ãã¥ãŒãã³ã°ãè¡ãå¿ èŠããããŸãïŒéæ³ã§ããããã以å€ã§ã¯æ©èœããŸããïŒã ãã¹ãã±ãŒã¹ã§ã¯ã
ConfigureSampleGrabberInitial()
ããã³
ConfigureSampleGrabberFinal()
ã¡ãœããããããæ åœããŸãã åæã»ããã¢ããäžã«
AMMEdiaType
ã決å®ãããæçµã»ããã¢ããäžã«
VideoInfoHeader
ãã€ã³ã¹ããŒã«ãã2ã€ã®
ISampleGrabber
ã¡ãœãããåŒã³åºãïŒ
SetBufferSamples(false)
ããã³
SetOneShot(false)
ã
æåã¯ãã£ã«ã¿ãŒãééãããµã³ãã«ã®ãããã¡ãªã³ã°ãç¡å¹ã«ããããã«å¿ èŠã§ããã2çªç®ã¯ã¹ã¯ãªãŒã³ã·ã§ããã®ã³ãŒã«ããã¯é¢æ°ãæ°åãã«ã§ããããã«ããããã§ãã
3.3.6ã Wmv圢åŒã.prxããã³WindowsMediaLibãã¡ã€ã«
蚱容ã§ããèšé²å質ã確ä¿ããã«ã¯ãwmvãã¡ã€ã«ã®èšé²èšå®ãåå®çŸ©ããå¿ èŠããããŸãã
ãããè¡ãæãç°¡åãªæ¹æ³ã¯ãæ¡åŒµåã.prxã®ãŠãŒã¶ãŒãããã¡ã€ã«ãã¡ã€ã«ãäœæãããã®ã¹ããªãŒã ã®å質ãæ åœãããã©ã¡ãŒã¿ãŒããªãŒããŒã©ã€ãããããšã§ãã ã³ãŒãå ã®ãã®ãã¡ã€ã«ã®äŸã¯good.prxã§ã
ãããã¡ã€ã«ãã¡ã€ã«ãèªã¿åãã
ConfigProfileFromFile(IBaseFilter asfWriter, string filename)
ã¡ãœãã
ConfigProfileFromFile(IBaseFilter asfWriter, string filename)
ã§ãããã¡ã€ã«ãäœæããããã«ãGPLã©ã€ã»ã³ã¹ã§é åžãããŠããTeam MediaPortalãããžã§ã¯ãã®WMLibã¯ã©ã¹ã䜿çšãããŸããã äœæããããããã¡ã€ã«ã¯ã
ConfigureFilterUsingProfile(wmProfile)
ã€ã³ã¿ãŒãã§ã€ã¹ã®
ConfigureFilterUsingProfile(wmProfile)
ã¡ãœãããä»ããŠASFã©ã€ã¿ãŒã«é©çšãããŸãã
ããšããã倧ããªåé¡ã®ä»£ããã«
Mpeg4Layer3ãã³ãŒããã¯ãAVIMuxããã³ãªãŒãã£ãªãšãããªã®åæ
ã¢ããªã±ãŒã·ã§ã³éçºã®æåã®æ®µéã§ã¯ã次ã®ã°ã©ãã®ããã«ããããªãMpeg4圢åŒã§ãé³å£°ãLayer3圢åŒã§èšé²ããããããã¹ãŠãAVI MUXãš1ã€ã®ãã¡ã€ã«ã«çµåããããšãèããŠããŸããã
XVid Codecãã£ã«ã¿ãŒã®ä»£ããã«ãMpeg-4ã®ãããªã³ã³ãã¬ããµãŒããã®ä»»æã®ãã£ã«ã¿ãŒã䜿çšã§ããŸãã xvidãšffdshowã®äž¡æ¹ãããã³ä»ã®ããã€ãã®ãã£ã«ã¿ãŒã䜿çšããè©Šã¿ããããŸããããã°ã©ãã«ãããªãèšé²ãããããšããããã€ãã®è©Šã¿ã®åŸããã¹ãŠãäžèŠããã»ã©åçŽã§ã¯ãªãããšãæããã«ãªããŸããã é²é³éå§åŸãã°ããããŠããé²é³ãäžæããåé¡ããããŸããã ããã§ã®çç±ã¯ãAVI MUXã³ã³ããã§ãããªãšãªãŒãã£ãªãããã·ã³ã°ãããšãããããªãšãªãŒãã£ãªãã©ãã¯ãèªåçã«åæããããæ£ããåšæ³¢æ°ã調æŽããŠããèšé²ãäžæãããåçäžã«ã°ã©ããã©ã³ãã ãªç¬éã«åæ¢ããå¯èœæ§ãããããã§ããªãŒãã£ãªãšãããªãåæããŠããªãããšã«æ³šæããŠãã ããã
æ®å¿µãªãããASF Writerã䜿çšããŠwmv圢åŒã§èšé²ã«ç§»è¡ããããšã«ãããæ ¹æ¬çãªæ¹æ³ã§å¯ŸåŠããªããã°ãªããªãã£ãããããã®åé¡ã®è§£æ±ºçã«ã€ããŠè©±ãããšã¯ã§ããŸããã
ãã®åé¡ã«ééãããã®åé¡ã«ç²ŸéããŠãã人ããã®èšäºãèªãã å Žåãåãã§ã¢ããã€ã¹ããŸãã
ããªãã®æ³šæãšé¢å¿ã«æè¬ããŸãããã®èšäºãèŽåœçãªéå±ã§ã¯ãªãããšãé¡ã£ãŠããŸãããŸãããã®è³æã誰ãã«ãšã£ãŠå®çšçã§ããããšãé¡ã£ãŠããŸãã