2017-03-20 1 views
0

FFmpeg se bloque lors du décodage d'un petit fichier mp3. La fente se produit de manière cohérente après avoir introduit environ 8 ou 9 tampons de données. Je n'ai aucune idée de ce qui se passe.Ffmpeg se bloque lors du décodage

  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

D'où avez-vous obtenu le blocksize? ffmpeg me montre une taille d'image de 2048 par défaut pour PCM 48khz-mono. – Mulvya

+1

Tout d'abord, assurez-vous que vous pouvez écrire toutes les sorties attendues dans un fichier local. Si cela fonctionne, vérifiez votre pipe. –

+0

@AlexCohn Je suis un peu dans la tête sur celui-ci im un peu débutant mais j'ai réussi à tout arranger jusqu'ici. –

Répondre

0

Il me manquait une dépendance sur le côté discord qui donnait l'impression que ffmpeg était en train de geler.

1

Vos arguments:

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

Ce sont les arguments que j'utiliser pour convertir mp3:

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

Je crois -ac 1 est mono et -ac 2 est stéréo
https://trac.ffmpeg.org/wiki/AudioChannelManipulation#monostereo

Quand J'ai utilisé vos args avec -f s16le pour convertir un mp3, le fichier est sorti corrompu et muet. Si vous l'excluez, je pense qu'il convertit automatiquement en 16 bits automatiquement.

Vous pouvez aussi essayer:

-f pcm_s16le 

Peut-être que ces détails conduira vous aider à résoudre le problème.

+0

Légende, je vais essayer quand je rentre à la maison. –

+2

'-f s16le' est un PCM brut, c'est-à-dire la charge utile d'un WAV/AIFF sans aucun en-tête. L'OP tente de décoder un MP3, et non de l'encoder en MP3. – Mulvya

+1

@Mulvya Je vois, je vais jeter un autre regard sur une solution. –