2017-03-20 52 views
0

小さなmp3ファイルをデコード中にFFmpegがフリーズする。クラッシュは、約8または9個のデータバッファを処理した後に偶然に起こります。私は何が起こっているのか分かりません。デコード中にFfmpegがフリーズする

  await e.Channel.SendMessage("Playing"); 
      var server = e.Server; 
      var voiceChannel = client.FindServers(server.Name).FirstOrDefault().VoiceChannels.FirstOrDefault(); 
      var _vClient = await client.GetService<AudioService>() 
       .Join(voiceChannel); 

      var pathOrUrl = "a.mp3"; 

      var process = Process.Start(new ProcessStartInfo 
      { // FFmpeg requires us to spawn a process and hook into its stdout, so we will create a Process 
       FileName = "ffmpeg", 
       Arguments = $"-i {pathOrUrl} " + // Here we provide a list of arguments to feed into FFmpeg. -i means the location of the file/URL it will read from 
          "-f s16le -ar 48000 -ac 1 pipe:1", // Next, we tell it to output 16-bit 48000Hz PCM, over 2 channels, to stdout. 
       UseShellExecute = false, 
       RedirectStandardOutput = true // Capture the stdout of the process 
      }); 
      Thread.Sleep(2000); // Sleep for a few seconds to FFmpeg can start processing data. 

      int blockSize = 3840; // The size of bytes to read per frame; 1920 for mono 
      byte[] buffer = new byte[blockSize]; 
      int byteCount; 

      while (true) // Loop forever, so data will always be read 
      { 
       byteCount = process.StandardOutput.BaseStream // Access the underlying MemoryStream from the stdout of FFmpeg 
         .Read(buffer, 0, blockSize); // Read stdout into the buffer 

       if (byteCount == 0) { // FFmpeg did not output anything 
        Console.WriteLine("Finished"); 
        break; 
        }// Break out of the while(true) loop, since there was nothing to read. 

       _vClient.Send(buffer, 0, byteCount); // Send our data to Discord 
      } 
      _vClient.Wait(); 
+1

どこからブロックサイズを取得しましたか? ffmpegは48khz-mono PCMのデフォルトで2048のフレームサイズを表示します。 – Mulvya

+1

まず、すべての出力をローカルファイルに書き込むことができることを確認してください。これが機能する場合は、パイプをチェックしてください。 –

+0

@AlexCohn私はちょっと頭がおいて初心者ですが、これまでのことすべてを動かすことができました。 –

答えて

0

私はffmpegがフリーズしているように見せかける不協和力の側面に依存していませんでした。

1

あなたの引数:

-f s16le -ar 48000 -ac 1 pipe:1 

はこれらは私がmp3に変換するために使用する引数です:

-acodec libmp3lame -ar 48000 -ac 2 -map 0:a:0? 

私は-ac 1がモノであると-ac 2はステレオ
https://trac.ffmpeg.org/wiki/AudioChannelManipulation#monostereo

であると考えていますいつ 私は-f s16leとあなたのargsを使用してmp3を変換すると、ファイルが壊れて出てきてミュートされます。それを除外すると、私はそれがまだ16ビットに自動的に変換すると思います。

また、試すことができます。

-f pcm_s16le 

を多分これらの詳細は、あなたが問題を解決するための助けをリードします。

+0

伝説と言います。 –

+2

'-f s16le'は生のPCMです。つまり、ヘッダなしのWAV/AIFFのペイロードです.OPはMP3をエンコードせずにMP3をデコードしようとしています。 – Mulvya

+1

@Mulvya私は解決策をもう一度見ていきます。 –

関連する問題