Using FFmpeg with Red5 Pro for live streaming

Introduction

FFmpeg is an open source audio/video processing software which is capable of grabbing, publishing, downloading and transcoding media streams in real-time and via post-processing.

Given its vast range of supported codecs, FFmpeg can be used as a encoder/decoder in conjunction with Red5 pro to work with media streams. FFmpeg also popularly known as the swiss knife of streaming.

FFmpeg commands are command line based. They are generally executed from your shell/command prompt. Alternately you can also execute these commands from a programming language API for executing command line processes.

The basic format of a FFmpeg command:

ffmpeg [input-flags] -i [input-source] [output-flags] [output-destination]

FFmpeg supports various types of streaming and non-streaming media inputs over a wide range of protocols. [input-flags] refer to special command line parameters that can be used to configure a input being read into FFmpeg. [input-source] refers to one or more input sources specified in the FFmpeg command. FFmpeg is capable of reading multiple inputs (streaming/non-streaming) through a single command. [output-flags] are used to configure the FFmpeg output such as quality, bitrate, format, container etcetera. And finally the [output-destination] specifies the format and container of the output media (streaming/non-streaming). Similar to inputs, FFmpeg is capable of providing multiple outputs as well. In case of multiple outputs, combinations of [output-flags] and [output-destination] are repeated for each targeted output.

For more information on FFmpeg flags and outputs, please refer to the Recommended links section.

Getting started with FFmpeg

FFmpeg is available for different platforms with different distribution channels.

  • FFmpeg for Windows is available from ffmpeg.zeranoe.com. The distribution is an archive file which contains the FFmpeg windows executable (exe).
  • FFmpeg for linux should be compiled and built from source (to include all the latest codecs & libraries)) based on your operating system favour. It is recommended that you use either Ubuntu or CentOs operating system for running Red5 Pro friendly FFmpeg build.

Once you have acquired the FFmpeg software, you can run the following test command at your shell prompt to see what codecs your FFmpeg build supports:

Command

ffmpeg -i

Sample output

ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 40.100 / 55. 40.100
  libavcodec     57. 66.106 / 57. 66.106
  libavformat    57. 58.100 / 57. 58.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 67.100 /  6. 67.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100

References:

Locating Red5 Pro stream resources

Red5 Pro resources are defined in the context of scopes. Scopes are virtual provisions (analogous to hard drive partitions) within which Red5 resources such as connections, streams etc reside. When you connect to Red5 Pro, you basically connect to an application running on the Red5 Pro instance to publish/subscribe.

The basic format of a Red5 Pro connection url

protocol://server-host:port/application-name
  • protocol: The Red5 Pro supported protocol using which you wish to connect to the server for consuming services. Red5 Pro supports RTMP, RTSP and HLS protocols in the context of FFmpeg streaming.
  • server-host: The Red5 Pro instance host (DNS/IP) address.
  • port: The port over which the connection is to be established. Ports are based on supported protocols. For example, RTMP uses 1935, RTSP uses 8554 etc. For more information, you can check out this article on supported Red5 Pro ports.
  • application-name: The application is the connection point on the server where the client connects to. The application is a special type of scope (top level scope) where all the resources are created. The most commonly used application in the Red5 Pro server for streaming is the live application. The live app is distributed with every Red5 Pro release.

When attempting to publish or subscribe a stream on Red5 Pro, we use the following format.

protocol://server-host:port/application-name/streamname

Viewing a stream

To view a live stream which is running on Red5 Pro, you can navigate to the subscribe page: http://{host}:5080/live/subscribe.jsp?host={host} and open the link to the listed stream that you wish to view in a new page. If your stream is not listed on the subscribe page, then your stream is not being published to Red5 Pro.

Viewing streams

Publishing stream to Red5 Pro

Publish from devices

FFmpeg allows publishing standard a/v devices to Red5 Pro media server. A detailed article is published on the FFmpeg trac site, describing how to get a list of devices on your OS platform and using one of those devices to publish a stream to Red5 Pro.

Sample command to get list of devices (Windows)

ffmpeg -list_devices true -f dshow -i dummy

Sample output

ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 40.100 / 55. 40.100
  libavcodec     57. 66.106 / 57. 66.106
  libavformat    57. 58.100 / 57. 58.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 67.100 /  6. 67.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
[dshow @ 0000000000da6a80] DirectShow video devices (some may be both video and audio devices)
[dshow @ 0000000000da6a80]  "Logitech HD Webcam C510"
[dshow @ 0000000000da6a80]     Alternative name "@device_pnp_\\?\usb#vid_046d&pid_081d&mi_02#7&29fdfa74&0&0002#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{bbefb6c7-2fc4-4139-bb8b-a58bba724083}"
[dshow @ 0000000000da6a80] DirectShow audio devices
[dshow @ 0000000000da6a80]  "Microphone (HD Webcam C510)"
[dshow @ 0000000000da6a80]     Alternative name "@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{47BA1941-1678-4E33-8FB0-657C31D79FDA}"

Sample command to publish device(s) to Red5 pro over RTMP

ffmpeg -f dshow -i video="Logitech HD Webcam C510":audio="Microphone (HD Webcam C510)" -vcodec libx264 -pix_fmt yuv420p -s 640x480 -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -f flv rtmp://127.0.0.1:1935/live/streamname

Sample command to publish device(s) to Red5 pro over RTSP

ffmpeg -f dshow -i video="Logitech HD Webcam C510":audio="Microphone (HD Webcam C510)" -vcodec libx264 -pix_fmt yuv420p -s 640x480 -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -f rtsp rtsp://127.0.0.1:8554/live/streamname

It is important to note that we are re-encoding the raw data from camera/microphone as h264 + aac before transmitting it to Red5 pro.

Depending on your os platform you can use a different audio library of aac For example on Linux, libfdk-aac is preferred over the internal aac library.

Publish from file

You can use FFmpeg to publish a media file as a live stream to Red5 Pro. Taking advantage of the vast range of decoders available in FFmpeg, we can read almost any file format and publish it to Red5 Pro as an H264 + AAC stream.

Below are sample commands to read an MP4 file and publish it to Red5 Pro.

Sample command to publish a file as a stream to Red5 pro over RTMP

Linux

ffmpeg  -i /tmp/sample.mp4  -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec libfdk_aac -ab 64000 -ar 48000 -ac 2 -f flv rtmp://127.0.0.1:1935/live/streamname

Windows

ffmpeg  -i C:\Downloads\uscenes_h-264_hd_test.mp4  -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -f flv rtmp://127.0.0.1:1935/live/streamname

Sample command to publish a file as a stream to Red5 pro over RTSP

Linux

ffmpeg  -i /tmp/sample.mp4  -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec libfdk_aac -ab 64000 -ar 48000 -ac 2 -f rtsp rtsp://127.0.0.1:8554/live/streamname

Windows

ffmpeg  -i C:\Downloads\uscenes_h-264_hd_test.mp4  -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -f rtsp rtsp://127.0.0.1:8554/live/streamname

Reading a stream from Red5 Pro

There are times when you may want to read a stream from the Red5 Pro server for the purpose of subscribing/recording/re-streaming.

Reading a RTMP Stream

Compared to other media server the Red5 pro media server requires a specific amount of time delay for the handshake + resource discovery to be successful. This time delay is provided as librtmp parameter from within the FFmpeg command.

Sample command to dump a live stream to an MP4 file.

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -acodec copy -vcodec libx264 -preset fast -f mp4 stream.mp4

From FFmpeg guide: The FFmpeg's "" flag means to "Read input at native frame rate. Mainly used to simulate a grab device." i.e. if you wanted to stream a video file, then you would want to use this, otherwise it might stream it too fast (it attempts to stream at line speed by default).

Sample Output

ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 40.100 / 55. 40.100
  libavcodec     57. 66.106 / 57. 66.106
  libavformat    57. 58.100 / 57. 58.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 67.100 /  6. 67.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Metadata:
  type                  rtc
  audioBR               56.00
  videoBR               750.00
[flv @ 0000000000d36e60] video stream discovered after head already parsed
[flv @ 0000000000d36e60] audio stream discovered after head already parsed
Input #0, flv, from 'rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2':
  Metadata:
    type            : rtc
    audioBR         : 56
    videoBR         : 750
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 640x480, 30.30 fps, 62.50 tbr, 1k tbn, 60 tbc
    Stream #0:1: Audio: aac (LC), 48000 Hz, mono, fltp

> It is important to note the `librtmp` parameters `live=1` and `timeout=2`. These are params used by the `librtmp` module to access the rtmp stream from the Red5 pro server. without the `live` param FFmpeg attempts to access a VOD(video on demand) file by the same name as the live stream.

Note: it is important to note that if you are unsure about the original codecs of the stream then it is always best to re-encode it to make it compatible with the format you are going to save it into.

Reading an RTSP Stream

Reading a stream using FFmpeg over RTSP is little different from the RTMP example. Here we don't use the librtmp module. Instead, FFmpeg makes use of its own internal RTSP reader.

Sample command to dump a live stream to an MP4 file.

ffmpeg  -i rtsp://127.0.0.1:8554/live/streamname  -acodec copy -vcodec copy -f mp4 stream.mp4

Sample Output

ffmpeg version N-82597-gd316b21 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 40.100 / 55. 40.100
  libavcodec     57. 66.106 / 57. 66.106
  libavformat    57. 58.100 / 57. 58.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 67.100 /  6. 67.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
[rtsp @ 00000000007c6c80] method SETUP failed: 461 Unsupported transport
Input #0, rtsp, from 'rtsp://127.0.0.1:8554/live/streamname':
  Metadata:
    title           : streamname
  Duration: N/A, start: 6461.310000, bitrate: N/A
    Stream #0:0: Audio: aac (LC), 48000 Hz, mono, fltp
    Stream #0:1: Video: h264 (Constrained Baseline), yuv420p(progressive), 640x480, 30 fps, 62.50 tbr, 90k tbn, 60 tbc

Press [q] to stop, [?] for help
frame=   31 fps= 21 q=-1.0 size=     111kB time=00:00:01.53 bitrate= 590.5kbits/s speed=1.02x

When reading stream over RTSP you may see this in the FFmpeg output: [rtsp @ 0000000000026c80] method SETUP failed: 461 Unsupported transport. But the processing will resume nevertheless after a 1-second pause.

NOTE: Throughout the examples in this document, we will be reading a Red5 Pro stream over RTMP to demonstrate various commands. You can use RTSP protocol as well if you wish, as explained earlier.

Sample command to re-encode & dump an RTMP live stream to an MP4 file

Linux

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec libfdk_aac -ab 64000 -ar 48000 -ac 2 -preset fast -f mp4 stream.mp4

Windows

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -preset fast -f mp4 stream.mp4

Sample command to re-encode & dump an RTSP live stream to an MP4 file

Linux

ffmpeg  -i rtsp://127.0.0.1:8445/live/streamname  -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec libfdk_aac -ab 64000 -ar 48000 -ac 2 -preset fast -f mp4 stream.mp4

Windows

ffmpeg  -i rtsp://127.0.0.1:8445/live/streamname -vcodec libx264  -vb 500k -vprofile baseline -level 2.1 -acodec aac -ab 64000 -ar 48000 -ac 2 -strict experimental -preset fast -f mp4 stream.mp4

Re-streaming using FFmpeg

Re streaming means re-transmitting stream packets. In a typical streaming environment, you can choose to re stream to the same media server with a different stream name and stream parameters or re stream to a completely different media server instance/type.

Sample command to re-stream a live stream back to Red5 Pro with a new bitrate

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264 -s 320x240 -vb 250k  -acodec copy -f flv "rtmp://127.0.0.1:1935/live/streamname_250 live=1"

Multi-Bitrate streaming

FFmpeg allows multiple outputs in a single command. This enables us to create different outputs with different encoding settings. Let us take a look at an example of multi-bitrate encoding using FFmpeg.

Sample command to generate multi-bitrate streams from a live stream & publish it back to Red5 Pro

Linux

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264 -s 640x480 -vb 500k  -acodec libfdk_aac -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_500 live=1" -vcodec libx264 -s 320x240 -vb 250k -acodec libfdk_aac -ab 48k -f flv "rtmp://127.0.0.1:1935/live/streamname_250 live=1"

Windows

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264 -s 640x480 -vb 500k  -acodec aac -strict experimental -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_500 live=1" -vcodec libx264 -s 320x240 -vb 250k -acodec aac -strict experimental -ab 48k -f flv "rtmp://127.0.0.1:1935/live/streamname_250 live=1"

Generating Multiple bitrates

Re-Streaming to YouTube

You can also re-stream a Red5 Pro stream to a different destination other than a Red5 Pro server. For example, you can use FFmpeg to re-stream a Red5 Pro stream to YouTube.

Note: You need to have a valid YouTube account and depending on whether you are using the 'stream now' feature or 'event' based streaming you should have set up your channel options correctly. Follow the youtube 'Encoder setup' guide properly and make a note of the 'Server URL' & 'Stream name/key' parameters.

Youtube live streaming channel

Sample command to re-stream a live stream to youtube from Red5 pro without re-encoding

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec copy -acodec copy -f flv "{Server URL}/{Stream name/key}"

Sample command to re-stream a live stream to YouTube from Red5 Pro with re-encoding

Linux

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264 -s 640x480 -vb 500k -acodec libfdk_aac -ab 128k  -f flv "{Server URL}/{Stream name/key}"

Windows

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -vcodec libx264 -s 640x480 -vb 500k -acodec aac -strict experimental -ab 128k  -f flv "{Server URL}/{Stream name/key}"

YouTube live streaming active channel

Miscellaneous examples

Embedding logo on live stream

FFmpeg also provides complex a/v filters which allow us to manipulate audio and video in a rather complex manner. We can use this to embed a png image as a brand logo on the live stream. Here we re-encode the stream to have the logo in each video frame and then package it along with the audio stream before publishing it to Red5 Pro.

Sample command to add logo to a live stream to a Red5 Pro live stream and re-transmit it as a new stream

Linux

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -i /home/rajdeeprath/Downloads/red5pro_logo.png -filter_complex "overlay=0:0" -vcodec libx264 -acodec libfdk_aac -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_logo live=1"

Windows

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -i M:\\workspace-ffmpeg\\red5pro_logo.png -filter_complex "overlay=0:0" -vcodec libx264 -acodec aac -strict experimental -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_logo live=1"

Overlaying a logo on a Red5 pro live stream

Recording & re-streaming at the same time

Sample command to save a Red5 Pro stream to disk and at the same time, re-stream it back to Red5 Pro with a different bitrate

Linux

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -acodec copy -vcodec libx264 -preset fast -f mp4 stream.mp4 -vcodec libx264 -s 640x480 -vb 500k  -acodec libfdk_aac -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_500 live=1"

Windows

ffmpeg  -i "rtmp://127.0.0.1:1935/live/streamname live=1 timeout=2" -acodec copy -vcodec libx264 -preset fast -f mp4 stream.mp4 -vcodec libx264 -s 640x480 -vb 500k  -acodec aac -strict experimental -ab 128k -f flv "rtmp://127.0.0.1:1935/live/streamname_500 live=1"

Optimizing

You can further optimize FFmpeg commands to improving latency, processing speed, video quality, audio quality etc:. Here a few short-hand tips & recommendations on optimizations.

  1. FFmpeg provides a flag -tune zerolatency to reduce latency on the video processing. Although not a magic wand, you can always try it on your own to see if it makes a difference. Reference: https://trac.ffmpeg.org/wiki/StreamingGuide
  2. FFmpeg provides presets to determine frame processing speed. Sometimes a higher speed may skip frame details when reading & processing.On the other hand, slow processing may add to overall latency. Based on your use case and stream content you can select an optimal preset in your FFmpeg command.
  3. The Newer versions of FFmpeg include multithreading support which can take advantage of a multi-core processor more efficiently. You can read more about it in the official page.
  4. When re-encoding take special care to match your video frame rate & audio sample rate properly otherwise you may run into a/v sync issues.

Conclusion

FFmpeg is a great open source tool to read/write/manipulate live & recorded streams, and as it may seem it checks most of the boxes. However, you will notice that there are some latency issues (which can be adjusted with more FFmpeg flags but not perfected) when using FFmpeg with Red5 Pro and also you have to deal with security on your own. For a standard workflow, it is recommended that you use the Red5 Pro HTML5 SDK (for WebRTC) and the Red5 Pro mobile SDKs for Android/IOS streaming for best results.

  • FFmpeg trac: Provides lots of practical examples on encoding/transcoding, capturing devices, screen sharing, building FFmpeg for different platforms and much more.
  • FFmpeg main site: Provides detailed information on the FFmpeg, including information about every flag, codec, protocol and extended capabilities.
  • FFmpeg github repo: The official github repo for FFmpeg