FFMPEG находится в бесконечном состоянии во время прямой трансляции на YouTube - PullRequest
0 голосов
/ 11 апреля 2019

Я работал в AS3 для потоковой передачи видео 1080P на YouTube, и видео начинает загружаться, и почти 4-5 минут видео было успешно загружено, и после этого YouTube показывает, что поток был завершен, но FFMPEG никогда не попадет "Выход "или любой другой метод, даже после ожидания в течение следующих 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);
}

Я также пытался использовать видео 720P, изменив битрейт с 4500kдо 2500k, что соответствует YouTube и работает нормально, но с 1080P что-то не получилось, как ожидалось.

Вот детали видео: Разрешение: 1920 * 1080 Скорость передачи данных: 3220 Кбит / с FrameRate: 20 Video Description

Заранее спасибо

1 Ответ

2 голосов
/ 17 апреля 2019

Существует две проблемы со следующим кодом.

  1. В функции «прогресс» я не читаю фактический журнал FFMPEG, необходимо обновить событие прогресса, как показано ниже.

    public function progress(e:ProgressEvent):void 
    {
        trace("Progress: ", _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
    }
    
  2. На данный момент я только что проследил, что журнал и код работают правильно в режиме отладки после создания проблемы со сборкой, после чего я записал все данные в файл, а затем даже после создания сборки все работает нормально. .

Я не знаю точную причину этого, но это решение пока мне помогает.

Спасибо

...