programa - ActionScript 3 FFMPEG pierde metadatos de video
quitar metadatos mp4 (1)
Tome este ejemplo de un código de trabajo para convertir un video (un AVI en mi caso) a un archivo de video FLV usando ffmpeg a través del NativeProcess
de AIR:
var loader:VideoLoader,
exe:File = File.applicationDirectory.resolvePath(''ffmpeg.exe''),
video_in:File = File.applicationDirectory.resolvePath(''video.avi''),
video_out:File = File.applicationDirectory.resolvePath(''video.flv'');
var args:Vector.<String> = new Vector.<String>();
args.push("-i", video_in.nativePath, "-b:v", "800k", "-ar", "44100", "-ab", "96k", "-f", "flv", video_out.nativePath);
var npsi:NativeProcessStartupInfo = new NativeProcessStartupInfo();
npsi.executable = exe;
npsi.arguments = args;
var process:NativeProcess = new NativeProcess();
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
process.start(npsi);
function onOutputData(event:ProgressEvent):void
{
trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable));
}
function onErrorData(event:ProgressEvent):void
{
trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable));
}
function onExit(event:NativeProcessExitEvent):void
{
playFLV();
}
function onIOError(event:IOErrorEvent):void
{
trace(event.toString());
}
function playFLV()
{
loader = new VideoLoader(
video_out.nativePath,
{
container: this,
width: 400,
height: 300,
scaleMode: "proportionalInside",
bgColor: 0x000000,
autoPlay: true,
volume: 0.5
}
);
loader.addEventListener(LoaderEvent.COMPLETE, onVideoLoad);
loader.load();
}
function onVideoLoad(e:LoaderEvent): void {
trace(loader.duration); // gives for example : 67.238
loader.playVideo();
}
Espero que pueda ayudar.
Estoy convirtiendo archivos de video al formato .flv usando FFMPEG para poder usar LoaderMax (GreenSocks) para reproducir los archivos de video. El problema es que cuando el video se convierte con FFMPEG, los metadatos se pierden, así que no puedo más tarde con LoaderMax obtener la duración o el tiempo de reproducción actual con el siguiente código.
video.getTime();
video.duration();
Podría obtener la duración del video antes de convertirlo con FFMPEG con la suficiente facilidad, pero esto no resuelve el problema de poder obtener el tiempo de reproducción actual. Mi objetivo es permitir al usuario hacer clic en la barra de búsqueda y saltar a cualquier punto del video que funcione, pero por razones obvias necesito poder mostrar la hora actual y la duración del video.
Estoy intentando ahora usar FFMPEG con algo llamado flvtool2 que debería reconstruir los metadatos.
Mi código actualmente para esto:
nativeProcessInfo = new NativeProcessStartupInfo();
nativeProcessInfo.executable = File.applicationDirectory.resolvePath(ffmpegPath); //path to ffmpeg (included in project files)
//nativeProcessInfo.executable = File.applicationDirectory.resolvePath(flvtool2Path); //path to flvtool2 (included in project files)
var processArgument:Vector.<String> = new Vector.<String>(); //holds command line arguments for converting video
processArgument.push("-i"); //filename
processArgument.push(filePath);
processArgument.push("-s"); //size
processArgument.push("640x480");
processArgument.push("-b:v"); //bitrate - video
processArgument.push("4800k");
processArgument.push("-b:a"); //bitrate -
processArgument.push("6400k");
processArgument.push("-ar"); //audio sampling frequency
processArgument.push("44100");
processArgument.push("-ac"); //audio channels
processArgument.push("2");
processArgument.push("-ab"); //audio bitrate frequency
processArgument.push("160k");
processArgument.push("-f"); //force
processArgument.push("flv");
processArgument.push("-");
/*processArgument.push("|");
processArgument.push("flvtool2");
processArgument.push("-U");
processArgument.push("stdin");
processArgument.push(filePath);*/
nativeProcessInfo.arguments = processArgument;
if (NativeProcess.isSupported) {
nativeProcess = new NativeProcess();
nativeProcess.start(nativeProcessInfo); //start video buffering
nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, ProgressEventOutputHandler);
nativeProcess.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, ProgressEventErrorHandler);
nativeProcess.addEventListener(NativeProcessExitEvent.EXIT, NativeProcessExitHandler);
nativeProcess.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, standardIOErrorHandler);
nativeProcess.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, standardIOErrorHandler);
} else {
trace("!NativeProcess.isSupported");
}
Subí un proyecto de ejemplo para descargar, que debería ayudar a explicar el problema. Para usarlo, deberá apuntar las Propiedades de ActionScript a la ubicación de Greensock para usar LoaderMax y tener un video en algún lugar de su computadora para probarlo. El enlace es: http://www.prospectportal.co.uk/example.zip