Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to obtain list of audio input Devices with ffmpeg
Forum Updated to NodeBB v4.3 + New Features

How to obtain list of audio input Devices with ffmpeg

Scheduled Pinned Locked Moved Unsolved General and Desktop
qprocessffmpeg
3 Posts 3 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SavizS Offline
    SavizS Offline
    Saviz
    wrote on last edited by Saviz
    #1

    I have some code that uses a QProcess object to call ffmpeg executable in the background to perform some tasks.

    In this case I am trying to obtain the list of audio input device names from ffmpeg.

    Code:

    #include <QApplication>
    #include <QDebug>
    #include <QProcess>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QProcess process;
        QStringList arguments;
         
        arguments
                  << "-hide_banner"
                  << "-nostats"
                  << "-list_devices"
                  << "true"
                  << "-f"
                  << "dshow"
                  << "-i"
                  << "dummy";
        
        
        
            process.start("Path/to/ffmpeg", arguments);
        
            process.waitForFinished();
        
            // I use standard error because the "dummy" argument seems to raise a warning/error
            QByteArray output = process.readAllStandardError();
        
        
            qDebug() << output;
        
            process.close();
    
            return a.exec();
    }
    

    The code above works fine. (At least, it does exactly what it is told to...)

    Here is the debug output:

    [dshow @ 0000019e7d4190c0] "OBS Virtual Camera" (video)
    [dshow @ 0000019e7d4190c0]   Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{A3FCE0F5-3493-419F-958A-ABA1250EC20B}"
    [dshow @ 0000019e7d4190c0] "Microphone (Realtek(R) Audio)" (audio)
    [dshow @ 0000019e7d4190c0]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2409F2C8-F2CB-4A6D-AEA7-DAD79C4EE9DF}"
    dummy: Immediate exit requested
    

    There are two questions that I have about this:

    1- Currently, I use the readAllStandardError() method instead of the readAllStandardOutput() method, because the "dummy" argument in ffmpeg raises a Warning/Error. Is there a better alternative to this?

    2- The output generated by the above command does indeed list the devices, but I only need the audio devices. Furthermore, I need the format to be more friendly. Something similar to the following:

    "OBS Virtual Camera" (video)
    "Microphone (Realtek(R) Audio)" (audio)
     Other audio devices...
    

    So, I can retrieve them and put them in a QByteArray to show it in a GUI later on. Is there a better command to this that I am missing?

    (I am using a windows 11 machine for ffmpeg)

    B JonBJ 2 Replies Last reply
    0
    • SavizS Saviz

      I have some code that uses a QProcess object to call ffmpeg executable in the background to perform some tasks.

      In this case I am trying to obtain the list of audio input device names from ffmpeg.

      Code:

      #include <QApplication>
      #include <QDebug>
      #include <QProcess>
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          QProcess process;
          QStringList arguments;
           
          arguments
                    << "-hide_banner"
                    << "-nostats"
                    << "-list_devices"
                    << "true"
                    << "-f"
                    << "dshow"
                    << "-i"
                    << "dummy";
          
          
          
              process.start("Path/to/ffmpeg", arguments);
          
              process.waitForFinished();
          
              // I use standard error because the "dummy" argument seems to raise a warning/error
              QByteArray output = process.readAllStandardError();
          
          
              qDebug() << output;
          
              process.close();
      
              return a.exec();
      }
      

      The code above works fine. (At least, it does exactly what it is told to...)

      Here is the debug output:

      [dshow @ 0000019e7d4190c0] "OBS Virtual Camera" (video)
      [dshow @ 0000019e7d4190c0]   Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{A3FCE0F5-3493-419F-958A-ABA1250EC20B}"
      [dshow @ 0000019e7d4190c0] "Microphone (Realtek(R) Audio)" (audio)
      [dshow @ 0000019e7d4190c0]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2409F2C8-F2CB-4A6D-AEA7-DAD79C4EE9DF}"
      dummy: Immediate exit requested
      

      There are two questions that I have about this:

      1- Currently, I use the readAllStandardError() method instead of the readAllStandardOutput() method, because the "dummy" argument in ffmpeg raises a Warning/Error. Is there a better alternative to this?

      2- The output generated by the above command does indeed list the devices, but I only need the audio devices. Furthermore, I need the format to be more friendly. Something similar to the following:

      "OBS Virtual Camera" (video)
      "Microphone (Realtek(R) Audio)" (audio)
       Other audio devices...
      

      So, I can retrieve them and put them in a QByteArray to show it in a GUI later on. Is there a better command to this that I am missing?

      (I am using a windows 11 machine for ffmpeg)

      B Offline
      B Offline
      Bonnie
      wrote on last edited by Bonnie
      #2

      @Saviz Hey dear, this is not a ffmpeg related forum. You should find one and ask there if you want help about ffmpeg command.

      Ok, here's from what I know, there's no better command.
      If you want friendly output, just parse the text to read the names and write what you want to the GUI.

      *Note: The output of your audio devices contains both (video) and (audio) because that video device in the list can also be used as an audio input device. So I think we should keep that.

      1 Reply Last reply
      1
      • SavizS Saviz

        I have some code that uses a QProcess object to call ffmpeg executable in the background to perform some tasks.

        In this case I am trying to obtain the list of audio input device names from ffmpeg.

        Code:

        #include <QApplication>
        #include <QDebug>
        #include <QProcess>
        
        int main(int argc, char *argv[])
        {
            QApplication a(argc, argv);
        
            QProcess process;
            QStringList arguments;
             
            arguments
                      << "-hide_banner"
                      << "-nostats"
                      << "-list_devices"
                      << "true"
                      << "-f"
                      << "dshow"
                      << "-i"
                      << "dummy";
            
            
            
                process.start("Path/to/ffmpeg", arguments);
            
                process.waitForFinished();
            
                // I use standard error because the "dummy" argument seems to raise a warning/error
                QByteArray output = process.readAllStandardError();
            
            
                qDebug() << output;
            
                process.close();
        
                return a.exec();
        }
        

        The code above works fine. (At least, it does exactly what it is told to...)

        Here is the debug output:

        [dshow @ 0000019e7d4190c0] "OBS Virtual Camera" (video)
        [dshow @ 0000019e7d4190c0]   Alternative name "@device_sw_{860BB310-5D01-11D0-BD3B-00A0C911CE86}\{A3FCE0F5-3493-419F-958A-ABA1250EC20B}"
        [dshow @ 0000019e7d4190c0] "Microphone (Realtek(R) Audio)" (audio)
        [dshow @ 0000019e7d4190c0]   Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2409F2C8-F2CB-4A6D-AEA7-DAD79C4EE9DF}"
        dummy: Immediate exit requested
        

        There are two questions that I have about this:

        1- Currently, I use the readAllStandardError() method instead of the readAllStandardOutput() method, because the "dummy" argument in ffmpeg raises a Warning/Error. Is there a better alternative to this?

        2- The output generated by the above command does indeed list the devices, but I only need the audio devices. Furthermore, I need the format to be more friendly. Something similar to the following:

        "OBS Virtual Camera" (video)
        "Microphone (Realtek(R) Audio)" (audio)
         Other audio devices...
        

        So, I can retrieve them and put them in a QByteArray to show it in a GUI later on. Is there a better command to this that I am missing?

        (I am using a windows 11 machine for ffmpeg)

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #3

        @Saviz
        For the questions about what command line arguments you might want to pass to it you might be better asking in a forum for ffmpeg.

        When running a command whose output you are interested in you should always read both standard output and standard error.

        If you do not need to process them separately you might use QProcess::MergedChannels. But not if you need to parse them distinctly.

        If you want the output you show, and ffmpeg does not offer this, parse the output to produce what you want.

        1 Reply Last reply
        1

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved