S

snpsnp

Usuario (Argentina)

Primer post: 3 jun 2015Último post: 11 ago 2015
2
Posts
28
Puntos totales
2
Comentarios
S
Sistemas de ecuaciones Lineales de 2x2 en Vb.NET
Ciencia EducacionporAnónimo6/3/2015

Buenas, primer post que hago asi que en principio pido disculpas por la desprolijidad, si hay alguna opcion para insertar codigo, no la he visto traigo para quien le interese, una clase hecha en vb.NET que permite calcular, la compatibilidad de un sistema de ecuaciones lineales de 2x2 como tambien los conjuntos solucion, en caso de ser determinado, devolvera el punto de interseccion de las rectas, en caso de ser indeterminado, devolvera de forma parametrica, todos los puntos comunes a ambas rectas (infinitos pares que satisfacen dicho sistema) si desean probar la clase, incluyo un codigo de ejemplo de un formulario que posee los siguientes controles: TXTX1, TXTY1, TXTD1 (todos textboxes, pertenecientes a la primera ecuacion) TXTX2, TXTY2, TXTD2 (todos textboxes, pertenecientes a la segunda ecuacion) LblSolucion: Label (mostrara compatibilidad y solucion al sistema) CmdCalcular: Button (al presionarlo se realizaran los calculos necesarios CmdSalir: Button (al presionarlo se abandonara la aplicacion) Ahora si, sin mas, el codigo de la clase Public Class cSISTEMA2X2 Public Enum SISTEMA_TIPO_SOLUCION SCD SCI SI End Enum Public Structure VECTOR_2_C Public X As Double Public Y As Double End Structure Private _x1 As Double, _y1 As Double, _d1 As Double Private _x2 As Double, _y2 As Double, _d2 As Double Private m_TipoSolucion As SISTEMA_TIPO_SOLUCION Private solucion As VECTOR_2_C Public Sub New() Me.solucion = New VECTOR_2_C End Sub Public Sub New(ByVal x1 As Double, ByVal x2 As Double, ByVal y1 As Double, ByVal y2 As Double, ByVal d1 As Double, ByVal d2 As Double) Me.solucion = New VECTOR_2_C Me._x1 = x1 : Me._y1 = y1 : Me._d1 = d1 Me._x2 = x2 : Me._y2 = y2 : Me._d2 = d2 End Sub Public Property X1() As Double Get Return Me._x1 End Get Set(value As Double) Me._x1 = value End Set End Property Public Property Y1() As Double Get Return Me._y1 End Get Set(value As Double) Me._y1 = value End Set End Property Public Property D1() As Double Get Return Me._d1 End Get Set(value As Double) Me._d1 = value End Set End Property Public Property X2() As Double Get Return Me._x2 End Get Set(value As Double) Me._x2 = value End Set End Property Public Property Y2() As Double Get Return Me._y2 End Get Set(value As Double) Me._y2 = value End Set End Property Public Property D2() As Double Get Return Me._d2 End Get Set(value As Double) Me._d2 = value End Set End Property Public ReadOnly Property ConjSolucion() As VECTOR_2_C Get Return Me.solucion End Get End Property Public ReadOnly Property TipoSolucion As SISTEMA_TIPO_SOLUCION Get Return Me.m_TipoSolucion End Get End Property Public Sub Calcular() If (Me._x1 = 0 And Me._x2 = 0) Or (Me._y1 = 0 And Me._y2 = 0) Then 'SISTEMA DE DOS POR UNO Exit Sub End If Dim delta As Double Dim deltaX As Double Dim deltaY As Double 'CALCULAMOS LOS DETERMINANTES delta = (Me._x1 * Me._y2) - (Me._y1 * Me._x2) deltaX = (Me._d1 * Me._y2) - (Me._y1 * Me._d2) deltaY = (Me._x1 * Me._d2) - (Me._d1 * Me._x2) If delta = 0 Then 'SISTEMA INCOMPATIBLE O COMPATIBLE INDETERMINADO If deltaX <> 0 Or deltaY <> 0 Then 'INCOMPATIBLE (EVALUAR RANGOS DE MATRICES) Me.m_TipoSolucion = SISTEMA_TIPO_SOLUCION.SI Else 'COMPATIBLE INDETERMINADO (EVALUAR RANGOS DE MATRICES) Me.m_TipoSolucion = SISTEMA_TIPO_SOLUCION.SCI End If Me.solucion.X = Double.NaN Me.solucion.Y = Double.NaN Else 'RANGO = 2 'SCD Me.solucion.X = deltaX / delta Me.solucion.Y = deltaY / delta End If End Sub Public Overrides Function ToString() As String Dim szRet As String = "" If Me.m_TipoSolucion = SISTEMA_TIPO_SOLUCION.SCI Then 'DEVOLVEMOS UNA CADENA CON LA FORMA PARAMETRICA DE TODOS LOS PUNTOS COMUNES A AMBAS RECTAS If Me._x1 <> 0 Then 'DESPEJAMOS Y1 EN FUNCION DE X1 szRet = "{(x,y) ϵ R² / x = λ, y = " & (Me._d1 / Me._y1).ToString & IIf(Me._x1 / Me._y1 > 0, " - ", " + " ) & IIf(Math.Abs(Me._x1 / Me._y1) = 1, "λ", Math.Abs(Me._x1 / Me._y1) & "λ" ) & ", λ ϵ R}" ElseIf Me._x2 <> 0 Then 'DESPEJAMOS Y2 EN FUNCION DE X2 szRet = "{(x,y) ϵ R² / (x = λ, y = " & (Me._d2 / Me._y2).ToString & IIf(Me._x2 / Me._y2 > 0, " - ", " + " ) & IIf(Math.Abs(Me._x2 / Me._y2) = 1, "λ", Math.Abs(Me._x2 / Me._y2) & "λ" ) & ", λ ϵ R}" End If ElseIf Me.m_TipoSolucion = SISTEMA_TIPO_SOLUCION.SCD Then 'LAS RECTAS DE CORTAN EN UN SOLO PUNTO, DEVOLVEMOS DICHO PUNTO szRet = "{(" & Me.solucion.X & ", " & Me.solucion.Y & " )}" Else 'RECTAS PARALELAS szRet = "Conjunto Vacio" End If Return szRet End Function End Class Y ahora el codigo del formulario Private Sub CmdCalcular_Click(sender As System.Object, e As System.EventArgs) Handles CmdCalcular.Click Dim sistema As New cSISTEMA2X2 If Not Me.Validar Then Exit Sub Try sistema.X1 = Convert.ToDouble(TxtX1.Text) sistema.X2 = Convert.ToDouble(TXTX2.Text) sistema.Y1 = Convert.ToDouble(TXTY1.Text) sistema.Y2 = Convert.ToDouble(TXTY2.Text) sistema.D1 = Convert.ToDouble(TXTD1.Text) sistema.D2 = Convert.ToDouble(TXTD2.Text) Catch ex As Exception MsgBox("No se pudo establecer valores, asegurese de haberlos especificado correctamente", MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "Snoopy" ) Exit Sub End Try sistema.Calcular() LblSolucion.Text = "Compatibilidad del sistema: " & vbCrLf If sistema.TipoSolucion = cSISTEMA2X2.SISTEMA_TIPO_SOLUCION.SCI Then LblSolucion.Text &= "Compatible Indeterminado" & vbCrLf ElseIf sistema.TipoSolucion = cSISTEMA2X2.SISTEMA_TIPO_SOLUCION.SCD Then LblSolucion.Text &= "Compatible Determinado" & vbCrLf Else LblSolucion.Text &= "Sistema Incompatible" Exit Sub End If LblSolucion.Text &= vbCrLf & "Conjunto Solucion:" & vbCrLf & vbCrLf & sistema.ToString End Sub Public Function Validar() As Boolean Dim bRet As Boolean = False If TxtX1.Text = "" OrElse Not IsNumeric(TxtX1.Text) Then bRet = False TxtX1.BackColor = Color.Red Else bRet = True TxtX1.BackColor = Color.White End If If TXTX2.Text = "" OrElse Not IsNumeric(TXTX2.Text) Then bRet = False TXTX2.BackColor = Color.Red Else bRet = True TXTX2.BackColor = Color.White End If If TXTY1.Text = "" OrElse Not IsNumeric(TXTY1.Text) Then bRet = False TXTY1.BackColor = Color.Red Else bRet = True TXTY1.BackColor = Color.White End If If TXTY2.Text = "" OrElse Not IsNumeric(TXTY2.Text) Then bRet = False TXTY2.BackColor = Color.Red Else bRet = True TXTY2.BackColor = Color.White End If If TXTD1.Text = "" OrElse Not IsNumeric(TXTD1.Text) Then bRet = False TXTD1.BackColor = Color.Red Else bRet = True TXTD1.BackColor = Color.White End If If TXTD2.Text = "" OrElse Not IsNumeric(TXTD2.Text) Then bRet = False TXTD2.BackColor = Color.Red Else bRet = True TXTD2.BackColor = Color.White End If If (TxtX1.Text = "0" And TXTX2.Text = "0" ) Or (TXTY1.Text = "0" And TXTY2.Text = "0" ) Then MsgBox("Solo se soporta sistemas de 2X2, no de 2X1", MsgBoxStyle.Exclamation + MsgBoxStyle.OkOnly, "Snoopy" ) End If Return bRet End Function Private Sub CmdSalir_Click(sender As System.Object, e As System.EventArgs) Handles CmdSalir.Click Application.Exit() End Sub

0
2
Clase VB.NET/Directshow (Audio/Video Helper)
Clase VB.NET/Directshow (Audio/Video Helper)
Ciencia EducacionporAnónimo8/11/2015

Buenas buenas, aqui traigo una clase escrita en VB.NET que implementa la funcionalidad de Microsoft DirectShow para Abrir, Manejar, Reproducir, etc archivos multimedia Link al final de POST, la misma cuenta con diferentes metodos que permiten obtener diferente informacion sobre el Stream abierto como asi tambien algunos metodos de armado avanzados de Filter Graphs Esta clase expone gran parte de su funcionalidad implementando los filtros de LAV (splitter, audio decoder, video decoder) por lo cual es recomendable tenerlos instalados en el sistema de destino para obtener el maximo rendimiento de la misma, la misma tambien hace uso del Video Mixing Renderer 9 (Microsoft VMR9) para presentar el video en el dispositivo de salida Tambien es capaz de armar el Filter Graph manualmente (agregando uno a uno los filtros, negociar conexiones, conectarlos, etc) como tambien dispone de un metodo para utilizar Intelligent Connect en caso de que el armado del Filter Graph personalizado falle (por ejemplo, no se tiene los filtros de LAV instalados o dichos filtros no son compatibles con el stream que se intenta reproducir, aunque este ultimo punto es realmente dificil que suceda debido a que soportan un amplio margen de formatos distintos, pero igualmente podria darse el caso), el hecho de usar Intelligent Connect la hace compatible con un amplio numero de formatos distintos Referencia de la clase Enumeraciones Estado: Esta enumeracion se utiliza para determinar en que estado se encuentra el stream, consta de los siguientes miembros ESTADO_CERRADO: Indica que no hay un Stream Abierto ESTADO_ABIERTO: Indica que hay un stream listo para reproducir ESTADO_REPRODUCIENDO: Indica que se esta reproduciendo actualmente un Stream ESTADO_PAUSADO: Indica que el stream actual se encuentra en estado pausado ESTADO_DETENIDO Indica que el stream se encuentra detenido, al comenzar la reproduccion esta comenzara desde ceroERROR_LIST Esta enumeracion es utilizada por el evento "Error()" para especificar el motivo de falla de un metodo, consta de los siguientes miembros ERL_DIRECTSHOW Indica que se ha producido un error de DirectShow ERL_D3DDEVICE Indica que fallo la creacion del dispositivo de Direct3D ERL_D3DSURFACE Indica que fallo la creacion del surface de Direct3D ERL_RUTAINCORRECTA Indica que el archivo especificado no existe ERL_MODOINCORRECTO Indica que el estado del stream no es correcto para este comando ERL_VALORINCORRECTO Indica que el argumento no es correcto ERL_TFNOSOPORTADO Indica que el stream actual no soporta el formato de tiempo solicitado ERL_VENTANAINEXISTENTE Indica que algun handle de ventana (HWND) no es correcto ERL_DESCONOCIDO Indica un error no especificado, con el tiempo la idea es que este desaparezca y que el informe de errores sea lo mas especifico posibleFILTER_TYPE No implementada actualmente, en un futuro sera utilizada por el metodo UnderTheHood TIME_FORMAT: esta enumeracion nos sirve para especificar el formato de tiempo mediante el cual queremos hacer referencia al stream actual, la misma consta de los siguientes miembros TF_MILLISECONDS: Indica que el formato de tiempo sera especificado en Milisegundos (1/1000) segundos TF_FRAMES Indica que el formato de tiempo sera especificado en cuadros (Frames) notar que solo es compatible con algunos formatos de video TF_SECONDS Indica que el tiempo sera espeficado en segundos TF_MEDIATIME Indica que es el valor sera especificado en la unidad que maneja el RefClock de DirectShow (1/100 nanosegundos) TF_SAMPLES Indica que el valor de tiempo sera especificado uasndo Samples (muestras)PROP esta enumeracion es utilizada para establecer los valores ProcAmp del stream de video actual,, NOTA: Los parametros de ProcAmp se establecen utilizando el Mixer del Video Mixing Renderer 9 (VMR9), por lo cual si se provee a la aplicacion con un Custom Compositor (del cual depende el mixer de VMR9) estos metodos dejaran de funcionar, consta de los siguientes miembros BRIGHNESS: Indica que se debe obtener o establecer el brillo HUE: Indica que se debe obtener o establecer el Hue (Luminancia) SATURATION Indica que se debe obtener o establecer la saturacion del video CONTRAST Indica que se debe obtener o establecer el contraste del video Estructuras UNDER_THE_HOOD: Esta estructura se utiliza para recuperar informacion sobre todos los filtros, pines, direccion de los mismos, parametros de negociacion entre filtros, tamaño de los samples (allocators), etc, consta de los siguientes campos FilterName: (String) Nombre del filtro actual dentro del FilterGraph Pins(): (PIN_INFO) Arreglo que contendra informacion sobre todos los pines que posee cada filtroPIN_INFO: Esta estructura contiene informacion sobre un determinado pin es utilizada por la estructura UNDER_THE_HOOD para enumerar los pines de cada filtro y sus propiedades como asi tambien los MediaTypes (parametros de negociacion) de cada pin, consta de los siguientes campos PinName (String): Nombre del pin actual dentro del filtro PinDirection (PinDirection): Direccion del pin, puede ser PinDirection.Input o PinDirection.Output, Esta enumeracion se proviene del espacio de nombres DirectShowLib MajorType (Guid) Este campo contiene el GUID del tipo de datos negociado por el pin actual (puede utilizar la enumeracion DirectShowLib.MediaType para obtener informacion sobre este GUID) SubType (Guid): Este campo contiene el GUID del subtipo de datos negociado por el pin actual (puede utilizar la enumeracion DirectShowLib.MediaSubType para obtener informacion sobre este GUID) SampleSize (Long): Este campo posee informacion sobre el tamaño de los Samples (Tamaño negociado de los Allocators entre filtros), si el SampleSize es dinamico (algunos filtros lo soportan) puede que este campo no devuelva el valor correcto, usar bajo su responsabilidadVIDEO_STATS Esta estructura se utiliza para devolver ciertos parametros sobre la renderizacion de video en tiempo real desde el Video Mixing Renderer (VMR9), consta de los siguientes campos AVG_FRAME_RATE (Double): Este campo devuelve la cantidad promedio de cuadros por segundo dibujados por VMR9 (Frames Per Second o FPS) AVG_SYNC_OFFSET (Long): Este campo devuelve la cantidad promedio de cuadros que tuvieron que esperar en el allocator antes de ser dibujados debido a un error de sincronismo en el Filter Graph FRAMES_DRAWN (Long): Este campo determina la cantidad de cuadros dibujados por VMR9 FRAMES_DROPPED (Long): Este campo determina la cantidad de cuadros que tuvieron que ser eliminados debido a errores de sincronismo irrecuperablesAUDIO_STATS Esta estructura se utiliza para devolver ciertos parametros sobre la renderizacion de audio en tiempo real desde el Audio Decoder, consta de los siguientes campos CHANNELS (Long): Este campo determina si el stream posee sonido MonoAural (1) o sonido Stereo (2) SAMPLES_PER_SEC (Long): Este campo determina la cantidad de Samples (muestreos) por segundo que se envian a DirectSound a traves del Renderer AVG_BYTES_PER_SEC (Long): Este campo determina la cantidad promedio de Bytes Por Segundo que se envian a DirectSound a traves del Renderer BUFFER_DURATION (Long): Este campo informa la duracion (en MILISEGUNDOS) del buffer de DirectSound a traves del Renderer BUFFER_FILL (Long): Este campo determina en tiempo real el porcentaje de llenado del Buffer de DirectSoundM_M_V_D Esta estructura se utiliza para establecer u obtener los valores de ProcAmp del stream de video actual, IMPORTANTE es muy importante determinar los valores maximos y minimos por defecto antes de establecer valores de ProcAmp para un stream debido a que los mismos VARIAN de un hardware de video a otro, la misma cuenta con los siguientes campos dwMinValue (Single): Este campo nos sirve para determinar el valor minimo de la propiedad actual dwMaxValue (Single): Este campo nos sirve para determinar el valor maximo de la propiedad actual dwStep (Single): Este campo nos sirve para determinar el valor minimo de incremento o decremento de la propiedad actual dwDefault (Single): Este campo nos sirve para determinar el valor por defecto de la propiedad actual dwCurrrentValue (Single): Este campo nos permite especificar un nuevo valor para la propiedad actual de ProcAmpTextOverlayParams Esta estructura nos permite especificar los valores que se utilizaran por defecto para dibujar texto sobre el stream de video , consta de los siguientes campos FontFace (String): Este campo nos permite establecer el nombre de la fuente a utilizar FontColor (Color): Este campo nos permite establecer el color de la fuente Bold (Boolean): Este campo nos permite establecer si la fuente sera Negrita Italic (Boolean): Este campo nos permite establecer si la fuente sera Italic (K) UnderLine (Boolean): Este campo nos permite establecer si al fuente estara subrayada DrawBorder (Boolean): Este campo nos permite establecer si se dibujara un contorno color negro alrededor de la fuente, esto es util en ambientes donde el cuadro de video tenga color similar al color de la fuente AlphaColor (Color): Este campo no esta implementado debido a que Direct3D tiene la posibilidad de aplicar AlphaBlending sobre las Surfaces OutlineSize (Single): Este campo determina el ancho del contorno FontSize (Single): Este campo determina el tamaño de la fuente (ver informacion sobre metodo de dibujado para mayor informacion sobre este valor)Eventos La clase es capaz de disparar eventos simples, aunque no sera capaz de disparar eventos con suscripcion (Event Handlers) debido a que no son necesarios por el momento Los eventos que la clase puede disparar son: FileOpened(): Este evento se llamara cuando se haya abierto satisfactoriamente un archivo CustomGraphRendered(): Este evento se disparara cuando se haya logrado armar el Filter Graph usando LAV UsingIC(): Este evento se disparara cuando habiendo fallado el Custom Filter Graph, se opte por Intelligent Connect VolumeChanged(): Este evento se disparara cuando se haya modificado satisfactoriamente el Volumen BalanceChanged(): Este evento se disparara cuando se haya modificado satisfactoriamente el balance TimeFormatChanged(): Este evento se disparara cuando haya modificado satisfactoriamente el Formato de tiempo utilizado por el stream actual Error(ERROR_LIST): Este evento se disparara cuando se produzca un error al realizar una tarea, el argumento de tipo ERROR_LIST posee informacion sobre el falloPropiedades Filename (String): Obtiene o establece el nombre de archivo a reproducir por la instancia actual VideoWindow (IntPtr): Obtiene o establece el Handle de ventana (HWND) que se utilizara para reproducir el video , debe ser una ventana validaMainHandle (IntPtr): Obtiene o establece el Handle de ventana (HWND) de la ventana principal que contiene el subcontrol que reproduce el video , el mismo sera utilizado por Direct3DVideoSize (Size): Obtiene o establece el tamaño actual del video , si es stream no soporta video se disparara un evento de errorNativeVideoSize (Size) (Solo Lectura): Obtiene el tamaño original del video HasVideo (Boolean) (Solo Lectura): Obtiene un valor que determina si el stream actual posee video HasAudio (Boolean) (Solo Lectura): Obtiene un valor que determina si el stream posee audio, esto solo funcionara con el filtro de LAV en el Filter Graph, caso contrario siempre devolvera TrueHasText (Boolean) (Solo Lectura): Obtiene un valor que determina si hay actualmente un texto dibujado sobre el stream de video TimeFormat (TIME_FORMAT): Obtiene o establece el formato de tiempo utilizado por el stream actual, todas las llamadas a Position() y Duration() devolveran un valor usando este formatoPosition (Long): Devuelve la posicion actual de reproduccion dentro del streamDuration (Long) (Solo Lectura): Devuelve la duracion total del stream Rate(Double): Obtiene o establece la velocidad de reproduccion del stream actual, los posibles valores van desde 0 hasta 2.0F siendo 1.0F el valor originalMetodos Publicos Public Sub RW(ByVal uUnits As Long) Se desplaza "uUnits" Frames hacia adelante en el stream de video , el mismo debe soportar el formato de tiempo Frames y ademas soportar FrameSkipping (hasta ahora no encontre ninguno de los que tengo aca que lo soporte) asi que de estar esta, pero casi nunca funciona Public Sub RW(ByVal uUnits As Long) Se desplaza "uUnits" hacia atras en el stream de video , el mismo debe soportar el formato de tiempo Frames y ademas soportar FrameSkipping (hasta ahora no encontre ninguno de los que tengo aca que lo soporte) asi que de estar esta, pero casi nunca funciona y encima debe ser soportado por el filtro que expone esta interfaz (el splitter en este caso) Public Function GetCurrentImage(ByVal sFileName As String) As Boolean Este metodo guarda el cuadro actual de video en un archivo JPEG especificado por el argumento sFileName, el mismo devuelve True si el proceso se realizo satisfactoriamente o False caso contrario Public Function GetCurrentImage(ByRef retBMP As Image) As Boolean Sobrecarga del metodo GetCurrentImage(ByVal sFileName As String) As Boolean en lugar de guardar el archivo a disco lo devuelve en un objeto Image para que pueda ser editado y/o manipulado a gusto antes de guardarlo Public Function GetValues(ByVal sProp As ENUMS.PROP) As ESTRUCTURAS.M_M_V_D Este metodo permite obtener los valores necesarios para poder luego modificar los parametros de ProcAmp (como de ser, brillo, contraste, saturacion, etc) Es indispensable llamar a este metodo antes de establecer dichos valores debido a que los valores posibles para cada parametro varian dependiendo del hardware de video sProp: determina que valor se desea obtener Valor Devuelto: Estructura M_M_V_D con los valores para la propiedad especificada Public Function SetProcAmpValue(ByVal PropToSet As ENUMS.PROP, ByVal dwVal As Single) As Boolean Este metodo establece el valor de ProcAmp especificado por el argumento PropToSet, este valor debe estar dentro de los parametros especificados por el controlador/hardware de video PropToSet: Enumeracion que permite especificar que valor se establecera dwVal: Nuevo valor que se establece para la propiedad PropToSet, el rango de variacion debe ser obtenida por GetValues() Valor Devuelto: Boolean: True si la operacion se completo correctamente, caso contrario devolvera False Public Function Open() As Boolean Este metodo abrira el archivo especificado por la propiedad FileName, el mismo intentara abrir el archivo en el siguiente orden 1º Intentara armar el Filter Graph personalizado con los filtros de LAV 2º Intentara usar Intelligent Connect para renderizar el archivo 3º Fallara la apertura del archivo (si llego hasta aqui es porque no hay forma de abrir dicho archivo en la configuracion actual de sistema) Valor Devuelvo: True si se abrio el archivo, False caso contrario, evaluar los eventos CustomGraphRendered() y/o UsingIC() para determinar el mecanismo utilizado por el metodo para la apertura Public Function Close() As Boolean Este metodo cerrara el stream abierto actualmente (en caso de haber alguno) y liberara todos los recursos utilizados por los objetos tanto administrados como no administrados Valor Devuelto: True si se logro cerrar el archivo con exito, False caso contrario Public Function Play() As Boolean Este metodo comenzara la reproduccion del archivo abierto actualmente (en caso de haber alguno) Valor Devuelto: True si se pudo comenzar la reproduccion, False caso contrario Public Function Pause() As Boolean Este metodo pondra el estado del stream actual en "Pausado" en caso de haber algun stream abierto Valor Devuelto: True si se logro el cambio de estado, False caso contrario Public Function Stop() As Boolean Este metodo pondra el estado del stream actual en "Detenido" en caso de haber algun stream abierto Valor Devuelto: True si se logro el cambio de estado, False caso contrario Public Sub RepaintVideo() Este metodo informa al Renderer de Video ( Video Mixing Renderer 9) que se debe repintar el area de video , como practica general, deberia llamar a este metodo en el evento paint del control que muestra el video Public Function WriteOverlayText(ByVal szText As String, ByVal bShow As Boolean) As Boolean Este metodo dibujara un texto encima del stream de video , el mismo se ubicara en la parte inferior central del video , no es necesario pausar el stream para realizar la mezcla Argumentos: szText: Texto que se desea colocar (puede ser nulo si bShow es igual a False) el texto se dibujara con los parametros previamente establecidos por las propiedades de tratamiento de texto Public Function GetVideoStats(ByRef dwStats As ESTRUCTURAS.VIDEO_STATS) As Boolean Este metodo devuelve informacion sobre el stream de video actual Argumentos: dwStats: aqui se depositara la informacion que se recupere del Video Renderer Valor Devuelvo: True si se completo exitosamente, False en caso contrario Public Function GetAudioInfo(ByRef dwRet As ESTRUCTURAS.AUDIO_STATS) As Boolean Este metodo devuelve informacion sobre el stream de audio actual Argumentos: dwRet: aqui se depositara la informacion que se recuperar del Decoder de Audio Valor Devuelto: True si se completo exitosamente, False en caso contrario Public Function UnderTheHood(ByRef dwRet() As ESTRUCTURAS.UNDER_THE_HOOD) As Boolean Este metodo devolvera informacion sobre todos los filtros, pines, MediaTypes y SampleAllocatorsSize presentes en el FilterGraph, esta informacion puede resultar particularmente util a la hora de depurar un Filter Graph Argumentos: dwRet(): este arreglo contendra toda la informacion, cada registro del arreglo correspondera a un filtro del Graph y el mismo contendra informacion sobre todos sus pines, los arreglos se reservan dinamicamente asi que no intente asignar un valor al arreglo en tiempo de diseño o el metodo fallara Valor Devuelvo: True si la se completo exitosamente, False de lo contrario Metodos Privados Private Function InitializeDirect3D() As Boolean Este metodo inicializa el Device y el Surface de direct3D que se usara para mezclar el texto sobre el stream de video Argumentos: Este metodo no toma argumentos Valor Devuelto: True si se completo exitosamente, False caso contrario Private Function CreateCustomFilterGraph(ByVal szFileName As String) As Boolean Este metodo intenta crear el FilterGraph personalizado (usando el set de filtros de LAV) para obtener asi un mayor control sobre el stream Argumentos FileName: este argumento especifica el archivo que se desea renderizarValor Devuelto: True si la operacion fue exitosa, False caso contrario Private Function ConfigureRenderer() As Boolean Este metodo configura el Renderer de video ( Video Mixing Renderer 9) para ser utilizado en nuestro FilterGraph Argumentos: Este metodo no tiene argumentos Valor Devuelto: True si se completo exitosamente, False caso contrario Private Function CustomGraphHasAudio(ByVal splitterFilter As IBaseFilter) As Boolean Este metodo determina si el Custom Filter Graph posee stream de audio y se utiliza para cargar el decoder y renderer de audio bajo demanda Argumentos splitterFilter: Referencia al splitter Filter del que se extraera la informacionValor Devuelto: True si se completo exitosamente, False caso contrario Private Function CustomGraphHasVideo(ByVal splitterFilter As IBaseFilter) As Boolean Este metodo determina si el Custom Filter Graph tiene un stream de video para poder asi cargar el Decoder y Renderer de video bajo demanda Argumentos splitterFilter: Referencia al Splitter Filter del que se extraera la informacionValor Devuelto: True si la operacion fue exitosa, False caso contrario Private Function ConnectCustomPinByNumber(ByVal USFilter As IBaseFilter, ByVal DSFilter As IBaseFilter, Optional ByVal USPinNumber As Integer = 0, Optional ByVal DSPinNumber As Integer = 0, Optional ByVal bUseICIfFailure As Boolean = False) As Boolean Este metodo conectara un pin desde un UpStream filter a un Downstream filter utilizando el ordinal del pin dentro de dicho filtro Argumentos USFilter: Referencia al filtro desde el cual se conectara el pinDSFilter: Referencia al filtro al cual se conectara el pinUSPinNumber: Numero de pin en el filtro de origen que se conectara, si no se especifica, se asumira el primer pin del filtroDSPinNumber: Numero de pin en el filtro de destino que se conectara, si no se especifica , se asumira el primer pin del filtrobUseICIfFailure: Si se no se pueden conectar dos filtros automaticamente, este argumento determina si se debe usar IntelligentConnect entre ambos filtros, por defecto no se utilizara y la conexion fallaraValor Devuelvo: True si se completo exitosamente, False caso contrario Private Function ConnectCustomPinByName(ByVal USFilter As IBaseFilter, ByVal DSFilter As IBaseFilter, ByVal USPinName As String, ByVal DSPinName As String, Optional ByVal bUseICIfFailure As Boolean = False) As Boolean Este metodo conectara un pin desde un Upstream Filter a un Downstream Filter utilizando el nombre del pin dentro de dicho filtro Argumentos USFilter: Referencia al filtro desde el cual se conectara el pinDSFilter: Referencia al filtro al cual se conectara el pinUSPinName Nombre de pin en el filtro de origen que se conectaraDSPinName: Nombre de pin en el filtro de destino que se conectarabUseICIfFailure: Si se no se pueden conectar dos filtros automaticamente, este argumento determina si se debe usar IntelligentConnect entre ambos filtros, por defecto no se utilizara y la conexion fallaraValor Devuelvo: True si se completo exitosamente, False caso contrario Private Function AddCustomFilter(ByVal bIsSource As Boolean, ByVal filterCLSiD As String, ByVal filterFriendlyName As String, ByRef Filter As IBaseFilter, Optional ByVal szFileName As String = "" As Boolean Este metodo agregara un filtro especificado al Custom Filter Graph Argumentos bIsDetermina si el filtro es un Source Filter filterCLSID: ClassID del filtro que se desea agregar FilterFriendlyName: Nombre del filtro que se deesea agregar Filter: Aqui se colocara la referencia al objeto que se acaba de alocacionarszFileName: Nombre de archivo que se desea abrir, este argumento se puede obviar si bIsSource esta establecido a FalseValor Devuelto: True si se completo exitosamente, False caso contrario Private Function ReleaseCustomFG() As Boolean Este metodo se asegura de liberar todos los recursos utilizados por el Custom Filter Graph Argumentos: Este metodo no acepta argumentos Valor Devuelto: True si se completo exitosamente, False caso contrario Private Function CloseAndRelease() As Boolean Este metodo se encarga de liberar los recursos utilizados en el orden que corresponde, una vez hecho esto, internamente llama al metodo ReleaseCustomFG() Argumentos: Este metodo no acepta argumentos Valor Devuelto: True si se completo exitosamente, False caso contrario Private Function CreateRectText(ByVal txt As String, ByVal ImgSize As Size, ByVal fntface As FontFamily, ByVal facecolor As Color, ByVal alphakey As Color, ByVal bBorder As Boolean, Optional ByVal bUnderline As Boolean = False, Optional ByVal bBold As Boolean = True, Optional ByVal bItalic As Boolean = False, Optional ByVal bStrikeThru As Boolean = False, Optional ByVal outlineSize As Single = 4.0, Optional ByVal fontSize As Single = 15.0F, Optional ByVal getBestFit As Boolean = True) As Image Este metodo crea un Bitmap con el tamaño especifico y le agrega el texto especificado al mismo Argumentos: txt: Especifica el texto que se dibujara ImgSize: Especifica el tamaño de la imagen (generalmente al tamaño del video fntface: Especifica la fuente a utilizar facecolor: Especifica el color de la fuente para el texto alphaKey: Especifica el color de transparencia (actualmente no implementado) bBorder: Especifica si se debe dibujar un borde a cada letra bUnderline: Especifica si el texto estara subrayado bBold: Especifica si el texto estara en negrita bItalic: Especifica si el texto estara en Italic (K) bStrikeThru: Especifica si el texto aparecera tachado (no se implementa pq queda horrible, pero sobre gustos...) el metodo estaoutlineSize: Tamaño del sombreadoFontsize: Tamaño del texto getBestFit: especifica si se debe utilizar el mayor tamaño posible de acuerdo con el tamaño del video (recomendado)Valor Devuelto: Image: devuelve la imagen lista para el Overlay Private Function RenderIntelligentConnect(ByVal szFileName As String) As Boolean Este metodo configura lo necesario e intenta abrir el stream solicitado mediante IntelligentConnect Argumentos szFileName: Nombre de archivo que se desea reproducir Valor Devuelto: True si se completo exitosamente, False caso contrario Esta clase Implementa ademas los metodos de IDisposable, para realizar la limpieza necesaria de objetos ya sea administrados como no administrados Asegurese de llamar al metodo Dispose() cuando deje de utilizar la instancia Bueno, ahora sin mas, publicare el codigo fuente en un repo de GitHub De mas esta decir lo que costo hacer todo esto (no se que costo mas, si diseñar/escribir el codigo fuente, o esta documentacion) asi que se agradeceria cualquier tipo de feedback en una proxima entrega publicare informacion sobre el codigo de la clase en si mismo y como hace que y cada cosa, como tambien algunos ejemplos de como crear instancias y utilizarlas para diferentes tareas como asi tambien una clase que utiliza parte de esta para extraer audio de un video y guardarlo en un archivo mp3 como tambien extraer el video (sacandole el audio) y rescribirlo a disco sin audio esto ultimo no sirve para mucho pero al menos les dara un pantallazo general sobre como funcionan los compresores y que podemos tunear para alterar la salida de los mismos, como asi tambien el uso del InfinitePin tee Filter Links de Interes DirectShowNet (Necesario) DirectX Managed SDK (Necesario) Nota Muy Importante al incluir los DLL de Direct3D en el proyecto probablemente los quiera obligar a usar el Framework 1.1 (cosa que no funciona muy bien) yo lo resolvi asi agregar en el app.config <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> En caso de que los putee por la arquitectura, les informo que lamentablemente el SDK de directX no corre bajo arquitectruas x64 por lo cual si estan compilando para x64 o AnyCPU (ambos release) deberan cambiarlos por x86 ahora si, aca va el link del codigo DirectShow AV Player Class

28
0
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.