17.3MB7Z
Grabado utilizando la implementación de línea de comandos ffmpeg será más conveniente, el efecto también es bueno, por supuesto, siempre que el control de los subprocesos de Windows para estar más familiarizados con, después de hacerlo fuera del proyecto puede satisfacer plenamente el uso.
prólogo
El capítulo anterior hemos logrado una captura de pantalla de la interfaz y la funcionalidad, la siguiente se puede lograr sobre la base de la función de grabación de pantalla, grabación de pantalla utilizando la línea de comandos ffmpeg será más conveniente para lograr algunos de los resultados también son buenos, por supuesto, siempre que el control de los subprocesos de Windows están más familiarizados con el proyecto se puede hacer para cumplir con el proyecto después de su uso.
I. Principales etapas
1、Uso PermiteTransparencia para lograr a través de la caja
La grabación de pantalla requiere AllowsTransparency para conseguir un fondo transparente, ya que el área encajonada necesita poder hacer clic a través del escritorio cuando se graba, lo que no es posible con WindowChome.
2、Obtener el nombre del dispositivo de audio
Debido a que no depende de herramientas de terceros (por ejemplo, grabadora de captura de pantalla), podemos utilizar dshow de ffmpeg para grabar sonido, siempre y cuando podamos obtener el nombre del dispositivo de audio. Podemos obtener el nombre del dispositivo llamando a Com, añadir una propiedad para obtener la lista de dispositivos de audio basado en "C# Get Windows Camera List Using com":
static readonly Guid AudioInputDevice = new Guid(0x33d9a762, 0x90c8, 0x11d0, 0xbd, 0x43, 0x0, 0xa0, 0xc9, 0x11, 0xce, 0x86);
///
/// Enumeración de dispositivos de grabación
///
public static IEnumerable AudioInputDevices
{
consiga
{
IMoniker[] monikers = nuevo IMoniker[5];
var devEnum = Activator.CreateInstance(Type.GetTypeFromCLSID(SystemDeviceEnum)) as ICreateDevEnum;
IEnumMoniker moniker.
if (devEnum.CreateClassEnumerator(AudioInputDevice, out moniker, 0) == 0)
{
while (true)
{
int hr = moniker.Next(1, monikers, IntPtr.Zero);
¡si (hr ! = 0 || monikers[0] == null)
romper;
yield return GetName(monikers[0]);
foreach (var i in monikers)
{
¡si (i ! = null)
Marshal.ReleaseComObject(i);
}
}
Marshal.ReleaseComObject(moniker);
}
Marshal.ReleaseComObject(devEnum);
}
}
Obtener el nombre del dispositivo de audio
cadena audio = null;
//Obtener el nombre del dispositivo de captura de audio
foreach (var i in EnumDevices.AudioInputDevices)
{
audio = i;
romper;
}
3, línea de comandos iniciar ffmpeg
Después de obtener el nombre del dispositivo de audio, podemos utilizar la siguiente línea de comandos es lograr la grabación.
Grabe la línea de comandos de la pantalla, -i audio=nombre del dispositivo de audio obtenido en el paso anterior.
ffmpeg -y -f dshow -sample_rate 44100 -sample_size 16 -channels 2 -i audio="microphone (Realtek High Definition Audio)" -f gdigrab -offset_x 10 -offset_y 20 -video_size 640×480 -i desktop -preset:v ultrafast -tune:v zerolatency -r 30 screen.mp4
1
Iniciar ffmpeg (ejemplo)
var process = nuevo Process();
process.StartInfo.FileName = "ffmpeg";
process.StartInfo.Arguments = "-y -f dshow -sample_rate 44100 -sample_size 16 -channels 2 -i audio="microphone (Realtek High Definition Audio) Definition Audio)\" -f gdigrab -offset_x 10 -offset_y 20 -video_size 640×480 -i desktop -preset:v ultrafast -tune:v zerolatency -r 30 screen.mp4 "
process.Start()
4. Uso de JobObject para gestionar procesos hijo
Inicio ffmpeg como un subproceso, la necesidad de algunos de su gestión, para garantizar que el proceso principal en cualquier caso de retirada del subproceso para seguir la salida, podemos utilizar el Windows JobObject para lograr esta función. c# necesidad de utilizar el embalaje dllimport Job Object WinApi.
Lo siguiente es parte del código de ejemplo: el objeto job se crea y se configura para que todos los procesos que se unan a él salgan después de que el objeto se destruya.
handle = CreateJobObject(IntPtr.Zero, null);
var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION
{
LimitFlags = 0x2000
};
var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
BasicLimitInformation = info
};
int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));;
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("No se pudo establecer la información. Error: {0}", Marshal.GetLastWin32Error()));;
II. Código completo
Implementada una función de grabación de pantalla, incluyendo grabación de pantalla y sonido, sólo dependiendo de ffmpeg.exe.
III. Previsión de efectos
1. Grabación en curso
2、Proceso dinámico de grabación
resúmenes
Por encima es el contenido de la charla de hoy, porque el uso de la línea de comandos para que la lógica de grabación no tienen que lograr su propia, pero para controlar los subprocesos ffmpeg o una serie de detalles que hay que tratar, tales como el proceso de salida automática, retroalimentación de información, detener la grabación, consejos anormales y así sucesivamente. Por otra parte, también hay cosas que necesitan ser tratados en la interfaz, tales como el control de clics, la parte superior de la ventana de control y así sucesivamente. En general, la implementación de este módulo funcional todavía requiere algo de tiempo y esfuerzo, así como algunos conocimientos pertinentes.
Declaración de recursos (la compra se considera un acuerdo con esta declaración): 1. Cualquier operación en la plataforma del sitio web se considera que han leído y aceptado la parte inferior del acuerdo de registro del sitio web y renuncia de responsabilidad, los recursos de este sitio han sido ultra-bajo precio, y no proporciona soporte técnico 2. Algunos usuarios de la red comparten la dirección de disco neto puede no ser válida, como la aparición de fallos, por favor envíe un correo electrónico al servicio al cliente code711cn#qq.com (sustituir # con @) se compondrá de enviar ¡3. Este sitio proporciona todos los recursos descargables (software, etc) sitio para asegurarse de que no hay cambios negativos, pero este sitio no puede garantizar la exactitud, seguridad e integridad de los recursos, las descargas de los usuarios a su propia discreción, nos comunicamos a aprender con el fin de no todo el código fuente no es 100% libre de errores o sin errores, es necesario tener una cierta base para poder leer y entender el código, para poder modificar la depuración! código y resolver errores. Al mismo tiempo, los usuarios de este sitio deben entender que la Source Code Convenience Store no posee ningún derecho sobre el software proporcionado para su descarga, los derechos de autor pertenecen al propietario legal del recurso. ¡4. Todos los recursos en este sitio sólo para fines de aprendizaje y de investigación, por favor debe ser eliminado dentro de las 24 horas de los recursos descargados, no utilice con fines comerciales, de lo contrario los conflictos legales derivados del sitio y el editor del sitio de responsabilidad colateral y no se llevará a cabo! 5. Debido a la naturaleza reproducible de los recursos, una vez adquiridos no son reembolsables, el saldo de recarga tampoco lo es.