From 2b89f7e7e86bb6672463d75de43c467cd9a10d9a Mon Sep 17 00:00:00 2001 From: john Date: Tue, 18 Mar 2025 07:36:46 +0800 Subject: [PATCH] Dvr: support h265 flv fragments. v6.0.162 v7.0.24 (#4296) 1. Issue When segmenting H.265 encoded FLV files using a DVR, the system does not create FLV segments at regular intervals as specified by the `dvr_wait_keyframe` configuration. 2. Configure dvr.segment.conf ```config listen 1935; max_connections 1000; daemon off; srs_log_tank console; vhost __defaultVhost__ { dvr { enabled on; dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv; dvr_plan segment; dvr_duration 30; dvr_wait_keyframe on; } } ``` 3. Stream Push Testing Domestic FFmpeg version (codecId=12) ```sh hevc-12-ffmpeg -stream_loop -1 -re -i 264_aac.flv -c:v libx265 -preset fast -b:v 2000k -maxrate 2000k -bufsize 4000k -bf 0 -c:a aac -b:a 128k -ar 44100 -ac 2 -f flv rtmp://localhost/live/livestream ``` FFmpeg version 6.0 or higher (supports `enhanced RTMP`) ```sh ffmpeg -stream_loop -1 -re -i 264_aac.flv -c:v libx265 -preset fast -b:v 2000k -maxrate 2000k -bufsize 4000k -bf 0 -c:a aac -b:a 128k -ar 44100 -ac 2 -f flv rtmp://localhost/live/livestream ``` OBS streaming (version 30.0 or above supports `enhanced RTMP`) ![image](https://github.com/user-attachments/assets/fd2806c3-b0e3-44c4-a2d5-e04e6e5386ff) ![image](https://github.com/user-attachments/assets/15ef9c45-e15a-426e-b70c-d4bdd5dc8055) SRS player (supports both `enhanced RTMP` and `codec=12 FLV`) ``` http://127.0.0.1:8080/players/srs_player.html ``` Domestic ffplay (supports `codec=12 FLV`) ``` hevc-12-ffplay http://127.0.0.1:8080/live/livestream.1740311867638.flv ``` ffplay (versions above ffmpeg 6.0 support `enhanced RTMP`) ``` ffplay http://127.0.0.1:8080/live/livestream.1740311867638.flv ``` ![image](https://github.com/user-attachments/assets/711a4182-418c-4134-934f-cba41a08e06f) --------- `TRANS_BY_GPT4` --------- Co-authored-by: Haibo Chen <495810242@qq.com> Co-authored-by: john Co-authored-by: winlin --------- Co-authored-by: john --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_dvr.cpp | 8 +++++++- trunk/src/core/srs_core_version6.hpp | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index c2869373f..d2290ecc8 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -7,6 +7,7 @@ The changelog for SRS. ## SRS 6.0 Changelog +* v6.0, 2025-03-06, Merge [#4296](https://github.com/ossrs/srs/pull/4296): Dvr: support h265 flv fragments. v6.0.162 (#4296) * v6.0, 2025-02-20, Merge [#4253](https://github.com/ossrs/srs/pull/4253): fix typo about heartbeat. v6.0.161 (#4253) * v6.0, 2025-02-19, Merge [#4291](https://github.com/ossrs/srs/pull/4291): fix ci error. v6.0.160 (#4291) * v6.0, 2025-01-14, Merge [#4271](https://github.com/ossrs/srs/pull/4271): update copyright to 2025. v6.0.159 (#4271) diff --git a/trunk/src/app/srs_app_dvr.cpp b/trunk/src/app/srs_app_dvr.cpp index d1a261c97..640445fcc 100644 --- a/trunk/src/app/srs_app_dvr.cpp +++ b/trunk/src/app/srs_app_dvr.cpp @@ -868,7 +868,13 @@ srs_error_t SrsDvrSegmentPlan::update_duration(SrsSharedPtrMessage* msg) char* payload = msg->payload; int size = msg->size; - bool is_key_frame = SrsFlvVideo::h264(payload, size) && SrsFlvVideo::keyframe(payload, size) && !SrsFlvVideo::sh(payload, size); + + bool codec_ok = SrsFlvVideo::h264(payload, size); +#ifdef SRS_H265 + codec_ok = codec_ok? true : SrsFlvVideo::hevc(payload, size); +#endif + + bool is_key_frame = codec_ok && SrsFlvVideo::keyframe(payload, size) && !SrsFlvVideo::sh(payload, size); if (!is_key_frame) { return err; } diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp index 63a50acfd..d26aba03e 100644 --- a/trunk/src/core/srs_core_version6.hpp +++ b/trunk/src/core/srs_core_version6.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 -#define VERSION_REVISION 161 +#define VERSION_REVISION 162 #endif