FFMPEG 在 YouTube 上直播时处于永无止境的状态

FFMPEG gets in never ending condition while live streaming on YouTube

我一直在使用 AS3 在 YouTube 上流式传输 1080P 视频,视频开始上传,大约 4-5 分钟的视频已成功上传,之后 YouTube 显示流式传输已结束,但 FFMPEG 永远不会点击在 "Exit" 或任何其他方法上,即使在等待接下来的 10 分钟之后。

下面是我使用的方法。

public var _nativeProcessStartupInfo:NativeProcessStartupInfo;
public var _processArgs:Vector.<String>;
public var _process:NativeProcess;
protected function StartVideo_clickHandler(event:MouseEvent):void
{
    _nativeProcessStartupInfo.executable = File.applicationStorageDirectory.resolvePath("ffmpeg.exe Path");
    _processArgs.push('-re');
    _processArgs.push('-i');
    _processArgs.push(VideoPath);
    _processArgs.push('-vcodec');
    _processArgs.push('copy');
    _processArgs.push('-acodec');
    _processArgs.push('copy');
    _processArgs.push('-maxrate');
    _processArgs.push('4500k');
    _processArgs.push('-bufsize');
    _processArgs.push('9000k');
    _processArgs.push('-pix_fmt'); 
    _processArgs.push('yuv422p');
    _processArgs.push('-preset');
    _processArgs.push('fast');
    _processArgs.push('-ac'); 
    _processArgs.push('2');
    _processArgs.push('-r'); 
    _processArgs.push('30');                            
    _processArgs.push('-g');
    _processArgs.push('60');                            
    _processArgs.push('-ar');
    _processArgs.push('44100');
    _processArgs.push('-f');
    _processArgs.push('flv');                   
    _processArgs.push(streamurl+'/'+streamname);
    _nativeProcessStartupInfo.arguments = _processArgs;
    _process = new NativeProcess();
    _process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
    _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, progress);
    _process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
    _process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOErrorNativeProcess);
    _process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOErrorNativeProcess);
    _process.start(_nativeProcessStartupInfo);
}
public function onIOErrorNativeProcess(event:IOErrorEvent):void
{
    trace(event.toString());
}
public function onOutputData(event:ProgressEvent):void
{
    trace("Got: ", _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable)); 
}
public function progress(e:ProgressEvent):void 
{
    trace(e);
}
public function onExit(e:NativeProcessExitEvent):void
{
    trace(e);
}

我也通过将比特率从 4500k 更改为 2500k 来尝试使用 720P 视频,这与 YouTube 一致,它工作正常,但使用 1080P 时有些事情没有达到预期。

视频详情如下: 分辨率:1920*1080 数据速率:3220kbps 帧率:20

提前致谢

下面的代码有两个问题。

  1. 在 "progress" 函数中我没有读取 FFMPEG 的实际日志,必须像下面这样更新进度事件。

    public function progress(e:ProgressEvent):void 
    {
        trace("Progress: ", _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
    }
    
  2. 现在我刚刚跟踪了日志,代码在创建构建问题后在调试模式下正常工作,之后我将所有数据记录在文件中,甚至在创建构建之后一切正常。

我不知道背后的确切原因,但这个解决方案暂时对我有帮助。

谢谢