Install dependencies and build Media Communications Mesh as described in the top level README.md, paragraph "Basic Installation".
-
Clone the FFmpeg repository (Release 7.0 by default) and apply patches
./clone-and-patch-ffmpeg.sh
Note: For FFmpeg Release 6.1, replace 7.0
with 6.1
in the above cloning script
-
Run the FFmpeg configuration tool
./configure-ffmpeg.sh
-
Build and install FFmpeg with the Media Communications Mesh FFmpeg plugin
./build-ffmpeg.sh
The next arguments are supported to configure a connection to Media Communications Mesh
Argument | Type | Description | Default |
---|---|---|---|
conn_type |
String | Connection type ("multipoint-group" or "st2110" ) |
"multipoint-group" |
urn |
String | Multipoint group URN | "192.168.97.1" |
ip_addr |
String | SMPTE ST2110 remote IP address | "192.168.96.1" |
port |
String | SMPTE ST2110 remote port (Transmitter), or local port (Receiver) | 9001 |
transport |
String | SMPTE ST2110 transport type ("st2110-20" , "st2110-22" , "st2110-30" , etc.) |
"st2110-20" |
socket_name |
String | Memif socket name | - |
interface_id |
Integer | Memif interface id | 0 |
The next arguments are supported to configure a video transmission
Argument | Type | Description | Default |
---|---|---|---|
video_size |
String | Video frame size ("640x480" , "hd720" , etc.) |
"1920x1080" |
pixel_format |
String | Video pixel format | "yuv422p10le" |
frame_rate |
String | Video frame rate (25 , 50 , 60 , etc.) |
25 |
This example demonstrates sending a video file from the 1st FFmpeg instance to the 2nd FFmpeg instance via Media Communications Mesh, then streaming it to a remote machine via UDP.
TBD
-
Start Media Proxy
sudo media_proxy -d 0000:32:01.1 -i 192.168.96.11 -r 192.168.97.11 -p 9200-9299 -t 8002
-
Start FFmpeg to receive frames from Media Communications Mesh and stream to a remote machine via UDP
sudo MCM_MEDIA_PROXY_PORT=8002 ffmpeg -re -f mcm \ -conn_type st2110 \ -transport st2110-20 \ -ip_addr 192.168.96.10 \ -port 9001 \ -frame_rate 24 \ -video_size nhd \ -pixel_format yuv422p10le \ -i - -vcodec mpeg4 -f mpegts udp://<remote-ip>:<remote-port>
-
Start Media Proxy
sudo media_proxy -d 0000:32:01.0 -i 192.168.96.10 -r 192.168.97.10 -p 9100-9199 -t 8001
-
Start FFmpeg to stream a video file to the receiver via Media Communications Mesh
sudo MCM_MEDIA_PROXY_PORT=8001 ffmpeg -i <video-file-path> -f mcm \ -conn_type st2110 \ -transport st2110-20 \ -ip_addr 192.168.96.11 \ -port 9001 \ -frame_rate 24 \ -video_size nhd \ -pixel_format yuv422p10le -
When working with raw video files that lack metadata, you must explicitly provide FFmpeg with the necessary video frame details. This includes specifying the format
-f rawvideo
, pixel format-pix_fmt
, and resolution-s WxH
. For example:ffmpeg -f rawvideo -pix_fmt yuv422p10le -s 1920x1080 -i <video-file-path> ...
On the remote machine start the VLC player and open a network stream from the next URL:
udp://@:1234
The table below shows a proper way to configure the sender and the receiver depending on the audio PCM encoding format
Audio encoding | Sender configuration | Receiver configuration |
---|---|---|
PCM 16-bit | Output device mcm_audio_pcm16 |
Input device mcm_audio_pcm16 |
PCM 24-bit | Output device mcm_audio_pcm24 |
Input device mcm_audio_pcm24 |
The next arguments are supported to configure an audio transmission
Argument | Type | Description | Default |
---|---|---|---|
channels |
Integer | Number of audio channels (1 , 2 , etc.) |
2 |
sample_rate |
Integer | Audio sample rate (48000 or 96000 ) |
48000 |
ptime |
String | Audio packet time according to ST2110-30 (the only option is "1ms" ) |
"1ms" |
This example demonstrates sending a PCM 24-bit encoded audio file from the 1st FFmpeg instance to the 2nd FFmpeg instance via Media Communications Mesh.
TBD
-
Start Media Proxy
sudo media_proxy -d 0000:32:01.1 -i 192.168.96.11 -r 192.168.97.11 -p 9200-9299 -t 8002
-
Start FFmpeg to receive packets from Media Communications Mesh and store on the disk
sudo MCM_MEDIA_PROXY_PORT=8002 ffmpeg -re -f mcm_audio_pcm24 \ -conn_type st2110 \ -ip_addr 192.168.96.10 \ -port 9001 \ -channels 2 \ -sample_rate 48000 \ -ptime 1ms \ -i - output.wav
-
Start Media Proxy
sudo media_proxy -d 0000:32:01.0 -i 192.168.96.10 -r 192.168.97.10 -p 9100-9199 -t 8001
-
Start FFmpeg to stream an audio file to the receiver via Media Communications Mesh
sudo MCM_MEDIA_PROXY_PORT=8001 ffmpeg -i <audio-file-path> -f mcm_audio_pcm24 \ -conn_type st2110 \ -ip_addr 192.168.96.11 \ -port 9001 \ -channels 2 \ -sample_rate 48000 \ -ptime 1ms -
FFmpeg build was successful but trying to run ffmpeg
results in shared libraries error:
root@my-machine:~# ffmpeg
ffmpeg: error while loading shared libraries: libavfilter.so.9: cannot open shared object file: No such file or directory
Resolution:
Try running ffmpeg or exporting the LD_LIBRARY_PATH
in your shell session by pointing to the /usr/local/lib
folder. Examples:
root@my-machine:~# LD_LIBRARY_PATH=/usr/local/lib ffmpeg
ffmpeg version n6.1.1-152-ge821e6c21d Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
Using export:
root@my-machine:~# export LD_LIBRARY_PATH=/usr/local/lib
root@my-machine:~# ffmpeg
ffmpeg version n6.1.1-152-ge821e6c21d Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)