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
提前致谢
下面的代码有两个问题。
在 "progress" 函数中我没有读取 FFMPEG 的实际日志,必须像下面这样更新进度事件。
public function progress(e:ProgressEvent):void
{
trace("Progress: ", _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
}
现在我刚刚跟踪了日志,代码在创建构建问题后在调试模式下正常工作,之后我将所有数据记录在文件中,甚至在创建构建之后一切正常。
我不知道背后的确切原因,但这个解决方案暂时对我有帮助。
谢谢
我一直在使用 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
提前致谢
下面的代码有两个问题。
在 "progress" 函数中我没有读取 FFMPEG 的实际日志,必须像下面这样更新进度事件。
public function progress(e:ProgressEvent):void { trace("Progress: ", _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable)); }
现在我刚刚跟踪了日志,代码在创建构建问题后在调试模式下正常工作,之后我将所有数据记录在文件中,甚至在创建构建之后一切正常。
我不知道背后的确切原因,但这个解决方案暂时对我有帮助。
谢谢