6

Building on @Allan's answer, I'm trying to redirect the ffmpeg output to a server.

$ ffmpeg -f avfoundation -i ":1" -t 10 - | ssh user@host .... -

But I get the following error message:

"At least one output file must be specified"

I've also tried using ffserver instead of SSH but I'm not having any luck.

Is it possible to stream audio in this way?

1

1 Answer 1

7

There are two solutions I can visualize for this scenario:

  • Saving the file to a remote computer
  • Having a live stream broadcast so a remote computer can receive the audio

Saving the file

This is probably the easiest method. Allow the stream to finish recording then copy it to a predetermined location on the network. This script should fit the bill:

#!/bin/bash
#
ffmpeg -f avfoundation -i ":1" -t 10 audiocapture.mp3
scp audiocapture.mp3 user@host:/foo/bar/audiocapture.mp3

exit 0

The script doesn't do any error checking of any kind but, will record from the microphone, then when finished it will copy it via SCP (secure copy) to a remote computer. To make this work, you need to set up SSH Keys to facilitate a non-interactive login.

Stream in real time

The other method, is to broadcast the audio via TCP via a point-to-point connection. Using the same input from the previous answer, we just change the output to a network stream:

$ ffmpeg -f avfoundation -i ":1" -t 10 -f mpegts "tcp://remote_host_or_IP_:port"

Where....

  • -f is the transport format; in this case mpegts (MPEG Transport Stream)
  • tcp://remote_host_or_IP_:port is the URI value of the remote computer's hostname/IP address and port number it will be listening on.

Set remote computer to "listen"

Using ffplay the remote computer can be set to receive the stream (I used Windows 10 for this part, but will work in macOS/Windows/BSD/Linux)

Issue the command

ffplay -i tcp://local_host_or_IP_addr:port?listen -hide_banner

Where....

  • -i defines the input stream
  • local_host_or_IP_addr:port is the IP address or hostname and the TCP port of the computer that's listening (not the computer that's streaming).
  • ?listen is required to put it into "listen mode" otherwise it will time out if the stream is not there.

Below is an example done in Windows 10 receiving the stream from a macOS host's microphone. The IP address of the Windows 10 machine is 10.0.0.123 and I am broadcasting on port 1234.

C:\Users\allan\Desktop\ffmpeg>ffplay -i tcp://10.0.0.123:1234?listen -hide_banner

    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

Once it begins to receive the broadcast, the values above will change and a player "visualization" window will open up.

Input #0, mpegts, from 'tcp://10.0.0.123:1234?listen':B f=0/0
384 kb/s    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
  Program 1   0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
    Metadata: 0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
Service01    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0       0B f=0/0
FFmpeg    nan    :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0   sq=    0B f=0/0
    Stream #0:0[0x100]: Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, fltp, 384 kb/s
  11.35 M-A:  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

It will continue to "listen" until the process is killed.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .