Commit Graph

82 Commits

Author SHA1 Message Date
Jacob Su
30ea67f5f2 MP4 DVR: Fix audio/video synchronization issues in WebRTC recordings. v6.0.172 v7.0.52 (#4230)
Fixes #3993 - WebRTC streams recorded to MP4 via DVR exhibit audio/video
synchronization issues, with audio typically ahead of video. **Note:
This issue is specific to MP4 format; FLV recordings are not affected.**

When WebRTC streams are converted to RTMP and then muxed to MP4, the
audio and video tracks may start at different timestamps. The MP4 muxer
was not accounting for this timing offset between the first audio and
video samples in the STTS (Sample Time-to-Sample) table, causing the
tracks to be misaligned in the final MP4 file.

Introduces `SrsMp4DvrJitter` class specifically for MP4 audio/video
synchronization:

- **Timestamp Tracking**: Records the DTS of the first audio and video
samples
- **Offset Calculation**: Computes the timing difference between track
start times
- **MP4 STTS Correction**: Sets appropriate `sample_delta` values in the
MP4 STTS table to maintain proper A/V sync

- Added `SrsMp4DvrJitter` class in `srs_kernel_mp4.hpp/cpp`
- Integrated jitter correction into `SrsMp4SampleManager::write_track()`
for MP4 format only
- Added comprehensive unit tests covering various timing scenarios
- **Scope**: Changes are isolated to MP4 kernel code and do not affect
FLV processing

This fix ensures that MP4 DVR recordings from WebRTC streams maintain
proper audio/video synchronization regardless of the relative timing of
the first audio and video frames, while leaving FLV format processing
unchanged.

---------

Co-authored-by: Haibo Chen <495810242@qq.com>
Co-authored-by: john <hondaxiao@tencent.com>
Co-authored-by: winlin <winlinvip@gmail.com>
Co-authored-by: OSSRS-AI <winlinam@gmail.com>
2025-08-12 09:54:29 -04:00
Winlin
6e1134fe9b
Use clang format. v7.0.52 (#4433)
---------

Co-authored-by: ChenGH <chengh_math@126.com>
2025-08-11 23:19:19 -04:00
Jacob Su
339897e0c7
Feature: Support HLS with fmp4 segment for HEVC/LLHLS. v7.0.51 (#4159)
Currently, SRS only supports HLS with MPEG-TS format segment files, but
for LL-HLS and HEVC, it requires the fMP4 format. See #4327 for details.
Furthermore, fMP4 has a smaller overhead compared to TS, and fMP4 can be
used for DVR. In short, fMP4 is definitely the future segment format for
HLS.

Start SRS with the config file that enables HLS with fMP4:

```
./objs/srs -c conf/hls.mp4.conf
```

Publish stream by FFmpeg:

```
ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream
```

Play the stream by SRS player:
[http://localhost:8080/live/livestream.m3u8](http://localhost:8080/players/srs_player.html?stream=livestream.m3u8)

Finished by AI:

* [AI: Change init.mp4 to the same directory of
m3u8.](17621c8442)
* [AI: Fix the error handling
bug.](af3758a592)
* [AI: Fix Chrome stuttering
problem.](aaab60c314)

---------

Co-authored-by: winlin <winlinvip@gmail.com>
2025-08-11 20:55:06 -04:00
Winlin
4e55bc83b7
Support custom deleter for SrsUniquePtr. (#4309)
SrsUniquePtr does not support array or object created by malloc, because
we only use delete to dispose the resource. You can use a custom
function to free the memory allocated by malloc or other allocators.
```cpp
      char* p = (char*)malloc(1024);
      SrsUniquePtr<char> ptr(p, your_free_chars);
```

This is used to replace the SrsAutoFreeH. For example:
```cpp
      addrinfo* r = NULL;
      SrsAutoFreeH(addrinfo, r, freeaddrinfo);
      getaddrinfo("127.0.0.1", NULL, &hints, &r);
```

Now, this can be replaced by:
```cpp
      addrinfo* r = NULL;
      getaddrinfo("127.0.0.1", NULL, &hints, &r);
      SrsUniquePtr<addrinfo> r2(r, freeaddrinfo);
```

Please aware that there is a slight difference between SrsAutoFreeH and
SrsUniquePtr. SrsAutoFreeH will track the address of pointer, while
SrsUniquePtr will not.
```cpp
      addrinfo* r = NULL;
      SrsAutoFreeH(addrinfo, r, freeaddrinfo); // r will be freed even r is changed later.
      SrsUniquePtr<addrinfo> ptr(r, freeaddrinfo); // crash because r is an invalid pointer.
```

---------

Co-authored-by: Haibo Chen <495810242@qq.com>
Co-authored-by: john <hondaxiao@tencent.com>
2025-04-26 00:01:34 -04:00
ChenGH
13597d1b7f
update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271)
update copyright to 2025

---------

Co-authored-by: john <hondaxiao@tencent.com>
Co-authored-by: winlin <winlinvip@gmail.com>
2025-01-14 17:35:18 +08:00
winlin
2a2da2253f Switch to 2013-2024. v6.0.109 2024-01-01 10:51:24 +08:00
winlin
29eff1a242 Refine LICENSE. 2023-10-23 14:33:19 +08:00
mapengfei53
edba2c25f1
HEVC: Support DVR HEVC stream to MP4. v6.0.14 (#3360)
* DVR: Support mp4 blackbox test based on hooks.
* HEVC: Support DASH HEVC stream
* Refine blackbox test. v6.0.14

Co-authored-by: pengfei.ma <pengfei.ma@ctechm.com>
Co-authored-by: winlin <winlin@vip.126.com>
2023-01-08 15:05:43 +08:00
winlin
c46ef81ff2 SRS5: Update license date to 2023. v5.0.123
PICK 72f8ed4916
2023-01-01 08:56:20 +08:00
john
d927996890 DASH: Fix number mode bug to make it run. v5.0.96 (#3240)
* Add utc time utility
* Fix calculate duration in fmp4
* Refine dash code, use segment template timeline
* Shrink m4s file and cleanup
* Support play by dash.js
* Use SegmentTemplate timeline mode with $Number$

Co-authored-by: winlin <winlin@vip.126.com>
2022-11-24 18:13:49 +08:00
winlin
d117145b95 Update date from 2021 to 2022. 2022-06-20 19:22:25 +08:00
winlin
d5c86dc5fa Switch LICENSE from MIT to **MIT or MulanPSL-2.0**. v5.0.21 2022-01-13 18:40:22 +08:00
winlin
716e578a19 Squash: Fix bugs 2021-12-26 17:30:51 +08:00
Haibo Chen
7fd5e8607c DVR: support mp3 audio codec. (#2593) v5.0.17 2021-10-16 14:06:43 +08:00
Winlin
c8a1e0f3da
Refine AUTHORS.txt to AUTHORS.md, etc. 5.0.8 (#2464)
* Refine AUTHORS.txt to AUTHORS.md, etc. 5.0.8

* Update README.md

* Update README.md

* Refine format for AUTHORS.md
2021-07-08 14:30:47 +08:00
winlin
15901cacee SquashSRS4: Use SPDX-License-Identifier: MIT. 5.0.3 2021-05-31 13:42:20 +08:00
winlin
8b74c7cb89 SquashSRS4: Happy 2021 2021-04-16 09:29:43 +08:00
winlin
c17474627b Merge SRS3 2020-12-18 09:34:32 +08:00
winlin
25c76c1e8a Fix #1694, Support DVR 2GB+ MP4 file. 3.0.155 2020-12-17 18:43:45 +08:00
winlin
c97e943b07 Merge SRS3 2020-12-17 12:27:47 +08:00
winlin
ab5ddd24e2 Fix #1548, Add edts in MP4 for Windows10. 3.0.154 2020-12-17 12:07:34 +08:00
winlin
721173e6af MP4: Fix warnings 2020-12-17 11:25:51 +08:00
winlin
d045ce5d74 Refine kernel buffer API. 2020-04-30 19:33:08 +08:00
winlin
f228b3809a Fix utest failed. 2020-04-05 21:22:50 +08:00
winlin
c1e124786c For #307, fix build warnings for rtc 2020-03-28 20:57:03 +08:00
winlin
76d92792b7 For #460, fix ipv6 intranet address filter bug. 3.0.93 2020-01-05 21:25:51 +08:00
winlin
e8dbee1474 Refine url/urn box dumps 2019-12-31 15:55:34 +08:00
winlin
d32a7e9770 Improve test coverage for mp4 box 2019-12-30 20:50:58 +08:00
winlin
f3831d2d5b Improve test coverage for mp4 dumps 2019-12-30 16:36:11 +08:00
winlin
b63f2f283d Fix mp4 security issue, check buffer when required size is variable. 2019-12-30 14:34:23 +08:00
winlin
9140e0f19d Improve test coverage for kernel mp4. 2019-12-30 13:50:19 +08:00
winlin
d783a12f89 Happy 2020 2019-12-30 10:10:35 +08:00
winlin
8a28a11648 For #299, increase dash segment size for avsync issue. 3.0.89 2019-12-29 18:21:45 +08:00
winlin
d11a7b2e00 For #299, fix some bugs in dash, it works now. 3.0.88 2019-12-27 20:47:33 +08:00
winlin
7584c47aaf Fix #1105, dvr mp4 supports playing on Chrome/Safari/Firefox. 3.0.86 2019-12-26 18:05:17 +08:00
winlin
e2def1b24f Ignore some coverage for mp4. 2019-12-24 17:42:00 +08:00
winlin
0c20a45f5c Ignore test coverage for some lines for mp4 2019-12-24 15:41:36 +08:00
winlin
58561b9f76 Refine utest 2019-05-14 08:40:22 +08:00
winlin
35fe05d62c Refine typo in kernel. 2019-04-22 09:19:05 +08:00
winlin
288bed6e26 Refine SrsTcpClient.timeout in time unit. 2019-04-18 07:58:37 +08:00
winlin
b2d1d84634 Change to 2019 2019-01-01 21:37:28 +08:00
winlin
dcc2a73e7a Refine kernel aac 2018-12-09 20:58:40 +08:00
winlin
ca1395a807 Change date from 2017 to 2018 2018-01-07 10:58:53 +08:00
winlin
204ef041da For #913, Kernel MP4 FLV HTTP support complex error. 2017-12-31 12:11:48 +08:00
winlin
0e9e1792fe For #299, write fMP4 for DASH. 2017-06-04 15:10:35 +08:00
winlin
baed1cc043 For #821, support parse dash video segment 2017-06-03 23:12:54 +08:00
winlin
8cc3ab2fa2 For #821, print mdat and udat 2017-06-03 19:00:19 +08:00
winlin
6c64297264 Fix #821, support MP4 file parser. 3.0.24 2017-05-30 19:40:03 +08:00
winlin
1e3550a52c For #821, Parse basic mp4 boxes. 2017-05-21 19:41:15 +08:00
winlin
eaccbd0f85 Support print MP4 box. 2017-05-14 22:16:15 +08:00