Actionscript 3 如何获得使用FFMPEG播放的视频的持续时间?

Actionscript 3 如何获得使用FFMPEG播放的视频的持续时间?,actionscript-3,ffmpeg,air,Actionscript 3,Ffmpeg,Air,我正在使用FFMPEG播放视频(因为我需要允许.avi和.mov格式),但目前无法获得视频的持续时间。如果我没有使用FFMPEG,那么使用onMetaData就足够简单了,但这会返回0,因为FFMPEG需要netStream.play(null)而不是netStream.play(videoPath) 我希望添加的用于检查视频持续时间的功能: nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputDa

我正在使用FFMPEG播放视频(因为我需要允许.avi和.mov格式),但目前无法获得视频的持续时间。如果我没有使用FFMPEG,那么使用onMetaData就足够简单了,但这会返回0,因为FFMPEG需要
netStream.play(null)
而不是
netStream.play(videoPath)

我希望添加的用于检查视频持续时间的功能:

nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);

public function onOutputData(e:ProgressEvent):void {
    var videoStream:ByteArray = new ByteArray();
    nativeProcess.standardOutput.readBytes(videoStream, 0, nativeProcess.standardOutput.bytesAvailable);
    netStream.appendBytes(videoStream);
}

您可以使用
ffmpeg
NativeProcess
获取视频的持续时间:

var video:File = File.applicationDirectory.resolvePath('video.avi'),
    exe:File = File.applicationDirectory.resolvePath('ffmpeg.exe');

if (NativeProcess.isSupported) {

    var args:Vector.<String> = new Vector.<String>();
        args.push("-i", video.nativePath);

    var npsi:NativeProcessStartupInfo = new NativeProcessStartupInfo();
        npsi.executable = exe;
        npsi.arguments = args;

    var process:NativeProcess = new NativeProcess();        
        process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, on_output_data);
        process.start(npsi);

    function on_output_data(e:ProgressEvent):void {
        var s:String = process.standardError.readUTFBytes(process.standardError.bytesAvailable);
        var a:Array = s.match(/Duration: (\d{2}:\d{2}:\d{2})/) || [];
        if(a.length > 0){
            trace('video duration :', a[1]);    
            // gives for example : video duration : 00:01:45
        }   
    }

} else {

    trace('NativeProcess is not supported');

}
希望这能有所帮助。

编辑(您可以尝试的另一种方式):

当NetStream播放视频时,它首先检查元数据,由于FLV元数据包含一个持续时间项,因此您可以尝试读取该项(元数据总是在任何实际视频帧数据之前先发送以进行追加)

1)声明一个公共变量以监听元数据

2)在同时设置NetStream时设置元侦听器

3)由上述“onMetaData”触发的“已接收元数据”功能


或者自动列出元数据中的每个可用条目

public function received_Meta ( v_data : Object ) : void
{
    trace("### Begin Metadata listing : FLV Entries ### "  );
        for (var entry:* in v_data) 
        {
            var value:Object = v_data[ entry ];
            trace(" > " + entry + " : " + value);
        }
    trace("### End of Metadata listing for this FLV ### "  );
}

我编辑了您的问题以包含此更改。您可以通过单击问题下方的“编辑”自行进行此类编辑。在StackOverflow上,您应该始终通过编辑问题来添加新信息,而不是将其全部放在评论中。问题应始终包含所有信息。在评论中搜索重要信息是乏味的。编辑是非常受鼓励的。如果你认为合适的话,你甚至可以(而且应该!)编辑其他用户的问题或答案(就像我对你的问题或答案所做的那样)+1以供onMetaData参考。。你已经接近自助了,但还不确定。虽然我已经把上面的答案标记为正确答案,但是这个答案对我来说更好,即使它确实需要等待缓冲区来完成。谢谢,不用担心。你要求“使用FFMPEG”,你得到了FFMPEG的方法。我只是在展示如何从AS3内部实现它。因为一个工具制作文件,另一个工具播放,所以它们都知道相同的信息。。。PS我添加了新的编辑。。我突然想到,在FLV播放时,AS3已经知道了它的持续时间。我应该先想到这个!!
public var metaListener : Object;
nc = new NetConnection();   nc.connect(null);
metaListener = new Object();
metaListener = { onMetaData: received_Meta };
ns = new NetStream(nc); ns.client = metaListener;
public function received_Meta ( v_data : Object ) : void
{
    trace("video duration   : "  + v_data.duration );
}
public function received_Meta ( v_data : Object ) : void
{
    trace("### Begin Metadata listing : FLV Entries ### "  );
        for (var entry:* in v_data) 
        {
            var value:Object = v_data[ entry ];
            trace(" > " + entry + " : " + value);
        }
    trace("### End of Metadata listing for this FLV ### "  );
}