| 分類:[.NET 全般]
OS:WindowsVista HomeEdition 開発言語:VB2010 PC:eMachine J3210
度々お世話になります。
現在、DirectShow を利用して、動画の再生、録画の機能を持ったアプリケーションを開発しています。 動画の再生、WEBカメラの映像をwmvに録画するところまでは、なんとか作る事ができました。
ですが、あと2点ほど、どうしても解決できない問題があります。
1.デスクトップの内容をwmv型式で録画する。
正確には、フォームの TransparencyKeyプロパティーにて透過させた状態で、 そのフォームに映っているものを録画できればと考えています。
2.wmv型式でのカメラの解像度及びビットレートを変更する。
解像度については、録画の型式を avi にすると変更できました。 しかし、wmv型式にすると変更できません。
↓変更できる result = _captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, fileName, muxFilter, sinkFilter) ↓変更できない result = _captureGraphBuilder.SetOutputFileName(MediaSubType.Asf, fileName, muxFilter, sinkFilter)
ビットレートについては、avi、wmv 共にできません。
以下が解像度及びビットレートを変更する関数の全体です。
------------------------------------------------------------------------ Private Sub SetConfigParms(ByVal iFrameRate As Integer, ByVal bitRate As Integer, ByVal iWidth As Integer, ByVal iHeight As Integer) Dim hr As Integer
Dim IMyInterfaceAttribute As Attribute = Attribute.GetCustomAttribute(GetType(IAMStreamConfig), GetType(GuidAttribute)) Dim iid As Guid = New Guid(CType(IMyInterfaceAttribute, GuidAttribute).Value) Dim o As Object = Nothing Dim media As AMMediaType = Nothing Dim videoStreamConfig As IAMStreamConfig Dim videoControl As IAMVideoControl = DirectCast(_captureFilter, IAMVideoControl)
' Find the stream config interface hr = _captureGraphBuilder.FindInterface(New DsGuid(PinCategory.Capture), New DsGuid(MediaType.Video), _captureFilter, iid, o)
videoStreamConfig = DirectCast(o, IAMStreamConfig) Try If (videoStreamConfig Is Nothing) Then Throw New Exception("Failed to get IAMStreamConfig") End If
'フォーマット取得 hr = videoStreamConfig.GetFormat(media) DsError.ThrowExceptionForHR(hr)
'ビデオヘッダー取得 Dim vHeader As VideoInfoHeader = New VideoInfoHeader() Marshal.PtrToStructure(media.formatPtr, vHeader)
'サンプルレート設定 If (iFrameRate > 0) Then vHeader.AvgTimePerFrame = CLng(10000000 / iFrameRate) End If 'ビットレート設定 If bitRate > 0 Then vHeader.BitRate = bitRate End If '幅設定 If (iWidth > 0) Then vHeader.BmiHeader.Width = iWidth End If '高さ設定 If (iHeight > 0) Then vHeader.BmiHeader.Height = iHeight End If
' Copy the media structure back Marshal.StructureToPtr(vHeader, media.formatPtr, False)
' Set the new format hr = videoStreamConfig.SetFormat(media) DsError.ThrowExceptionForHR(hr)
DsUtils.FreeAMMediaType(media) media = Nothing
' Fix upsidedown video If (Not videoControl Is Nothing) Then Dim pCapsFlags As VideoControlFlags
Dim pPin As IPin = DsFindPin.ByCategory(_captureFilter, PinCategory.Capture, 0) hr = videoControl.GetCaps(pPin, pCapsFlags) DsError.ThrowExceptionForHR(hr)
If (CLng(pCapsFlags & VideoControlFlags.FlipVertical) > 0) Then hr = videoControl.GetMode(pPin, pCapsFlags) DsError.ThrowExceptionForHR(hr)
hr = videoControl.SetMode(pPin, 0) End If End If Finally Marshal.ReleaseComObject(videoStreamConfig) End Try End Sub ------------------------------------------------------------------------
ご存知の方、よろしくお願いいたします。
|