1: Use esp-adf-libs build with IDF5.0 2: Change all examples and components to support IDF5.x 3: Add board define for C6
RTMP
- 中文版本
- Basic Example:

Example Brief
RTMP protocol is widely used in live streaming, realising one-to-many live broadcast support through server forwarding. This example demonstrates how to implement common RTMP scenarios such as Pusher, Puller, and Server Application on the ESP32 series boards, as well as the basic usage of the esp_rtmp module.
- Pusher Application It gathers video and audio data from the camera and microphone, and then sends it to RTMP Server. It supports the configuration of video resolution, video frame rate, audio format, audio sample rate, and audio channel.
- Puller Application It fetches audio and video data from the RTMP server and stores them into SDCard with FLV format. It is suitable for offline playback or extends to playback on board afterwards.
- Server Application It sets up a RTMP server on board. It supports to connect into multiple clients and broadcast stream data from Pusher to Puller.
Pusher Application and Server Application can be run on board at the same time in order to set up a local live streaming server.
Detailed codec support for esp_rtmp is as follows:
| esp_rtmp Supported | Standard RTMP Supported | Notes | |
|---|---|---|---|
| PCM | Y | Y | |
| G711 alaw | Y | Y | |
| G711 ulaw | Y | Y | |
| AAC | Y | Y | |
| MP3 | Y | Y | |
| H264 | Y | Y | |
| MJPEG | Y | N | Use CodecID 1 for MJPEG |
To play RTMP living stream or saved FLV file on a PC, please refer to Example Functionality.
Environment Setup
Hardware Required
This example runs on the boards that are marked with a green checkbox in the table. Please remember to select the board in menuconfig as discussed in Section Configuration below.
The camera model tested in this example is OV3660. For other models, please refer to esp32-camera.
Build and Flash
Default IDF Branch
This example supports IDF release/v4.4 and later branches. By default, it runs on IDF release/v4.4.
IDF Branch
-
The command to switch to IDF release/v4.4 branch is as follows:
cd $IDF_PATH git checkout master git pull git checkout release/v4.4 git submodule update --init --recursive
Configuration
The default board for this example is ESP32-S3-Korvo-2.
Choose RTMP Application work mode:
menuconfig > RTMP APP Configuration > Choose RTMP APP Work Mode
Configuration for Wireless network SSID and Password:
menuconfig > RTMP APP Configuration > `WiFi SSID` and `WiFi Password`
Configuration for RTMP server connection URI address:
menuconfig > RTMP APP Configuration > RTMP Server URI
If you are using a USB camera, please enable the following configuration, and change USB setting in record_src_cfg.h
menuconfig > AV Record Configuration > Support For USB Camera
Build and Flash
Build the project and flash it to the board, then run monitor tool to view serial output (replace PORT with your board's serial port name):
idf.py -p PORT flash monitor
To exit the serial monitor, type Ctrl-].
For full steps to configure and build an ESP-IDF project, please go to ESP-IDF Programming Guide and select the chip and version in the upper left corner of the page.
How to Use the Example
Example Functionality
-
Set up RTMP server on PC
If you are using an Ubuntu system, please refer to nginx RTMP server setting -
Push and Playback RTMP media stream
Once the RTMP application is running, you can access and test it with a common RTMP Pusher (ffmpeg) or RTMP Puller Software (ffmpeg, VLC, Pot Player, etc).
Since example uses MJPEG codec which have no official support yet, the video content in generated living stream by RTMP Pusher application and saved FLV file can't be recognized by common PC player. To play it, you can unzip ffmpeg.7z to getffplay.exedirectly on Windows, or you can modify the source code referring to ffmpeg_mjpeg.patch for latest FFmpeg and follow FFmpeg Compilation Guide to build. -
Push RTMP stream to RTMP server on board, using
ffmpeg
Please replaceYOUR_PUSH_FILEwith your push file path, and replaceRTMP_SERVER_IP_ADDRESSwith your board IP addressffmpeg -stream_loop -1 -re -i YOUR_PUSH_FILE.mp4 -c copy -f flv rtmp://RTMP_SERVER_IP_ADDRESS:1935/live/streams -
Using
ffmpegto play RTMP stream or recorded FLV file from the boardffplay -fflags nobuffer rtmp://RTMP_SERVER_IP_ADDRESS:1935/live/stream ffplay src.flv -
CLI settings
helpQuery all supported commandssetSetup audio and video configurationsw_jpegWhether using software JPEG encoderqualitySetup video quality, refer toav_record_video_quality_tfpsSetup video frameratechannelSetup audio channelsample_rateSetup audio sample rateafmtSetup audio format, refer toav_record_audio_fmt_tvfmtSetup audio format, refer toav_record_video_fmt_turlSetup RTMP or RTMPS server URL
Configuration example: set vfmt 1 sw_jpeg 0 quality 2 fps 25 afmt 1 channel 1 sample_rate 22050startStart to run RTMP applicationsstopStop the running applicationsiQuery current CPU loading and memory usageconnectConnect to wifi using ssid and password
-
Performance measured
-
Maximum video framerate when using camera encoded JPEG
Video Resolution Max FPS 1280 X 720 17 1024 X 768 27 640 X 480 27 480 X 320 32 320 X 240 27 -
Maximum video framerate when software encoded JPEG
Video Resolution Max FPS 640 X 480 11 480 X 320 22 320 X 240 22 -
Maximum video framerate when software encoded H264
Video Resolution Max FPS 320 X 240 10
-
How to push stream to Youtube
- Get RTMP or RTMPS stream URL from Youtube
- Login in to Youtube
- Click the camera icon in the top-right corner
- Click
Go Livein the dropdown menu, you will see following page

- Combine the Stream URL and Stream key together to form RTMP or RTMPS URL
rtmp://a.rtmp.youtube.com/live2/************ rtmps://a.rtmp.youtube.com/live2/***********
- Streaming to Youtube
- Login in to Youtube and start live stream channel firstly
- Configuration according Configuration and send
startafter system boot-up, then you can see the streaming video on Youtube. If you want to stop streaming process, just sendstopcommand. - Notes: Youtube only support H264 video codec, push MJPEG codec will cause connection fail. Sometimes DNS get wrong IP address, please try URL
rtmp://142.250.179.172/live2/***********instead.
Debug Tips
- Some error log will print out during stopping process, it is normal, please ignore it if system runs OK
- Prefer to use the default settings so that RAM space is enough
If meet
MEDIA_OS: Fail to create thread, please use IDF 4.4.3 or higher version to put thread stack onto SPI-RAM or else remove the conditionCONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORYin media_lib_os_freertos.c - If you meet system not response issue, sometimes it is network issue please wait for a while. If it doesn't response for long time, please enable following config, when issue happen send
assertcommand to use GDB to check the overall system status (command: thread apply all bt)menuconfig > ESP System Settings > GDBStub on panic - If you are using OV3660, sometimes camera send error log:
cam_hal: FB-SIZE: 138240 != 153600, it is sensor error, using OV2640 no such error log shown. - If you meet error log
RTMP_Connect: Remove fd 57 for timeout:74 size:346710when you are sending out high quality video from RTMP server. It means client doesn't read data until fifo exceed limit. You can either enlarge the fifo limitRTMP_SERVER_CLIENT_CACHE_SIZEin rtmp_server_app.c or send lower quality video. - All RTMP application will continue to run until timeout. You can change timeout setting
RTMP_APP_RUN_DURATIONin main.c to do long test. - To have better performance, AAC encoder input is limited to be 16k, 1 channel. You can remove the limit in rtmp_push_app.c.
Technical Support and Feedback
Please use the following feedback channels:
- For technical queries, go to the esp32.com forum
- For a feature request or bug report, create a GitHub issue
We will get back to you as soon as possible.