Skip to content

Commit 23a1872

Browse files
committed
F Added support for playing H265 in the sample app
1 parent bc2090c commit 23a1872

1 file changed

Lines changed: 38 additions & 10 deletions

File tree

src/RTSPServerApp/Program.cs

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
TrakBox audioTrackBox = null;
2222
TrakBox videoTrackBox = null;
2323
AudioSampleEntryBox audioSampleEntry = null;
24-
double videoFrameRate = 24;
24+
double videoFrameRate = 0;
25+
int audioSamplingRate = 0;
2526

2627
// frag_bunny.mp4 audio is not playable in VLC on Windows 11 (works on MacOS)
2728
using (Stream fs = new BufferedStream(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)))
@@ -37,12 +38,39 @@
3738
{
3839
videoTrackId = fmp4.FindVideoTrackID().First();
3940
videoFrameRate = fmp4.CalculateFrameRate(videoTrackBox);
41+
42+
var h264VisualSample = videoTrackBox.GetMdia().GetMinf().GetStbl().GetStsd().Children.FirstOrDefault(x => x.Type == VisualSampleEntryBox.TYPE3 || x.Type == VisualSampleEntryBox.TYPE4) as VisualSampleEntryBox;
43+
if (h264VisualSample != null)
44+
{
45+
var avcC = (h264VisualSample.Children.First(x => x.Type == AvcConfigurationBox.TYPE) as AvcConfigurationBox).AvcDecoderConfigurationRecord;
46+
server.VideoTrack = new SharpRTSPServer.H264Track(avcC.AvcProfileIndication, 0, avcC.AvcLevelIndication);
47+
}
48+
else
49+
{
50+
var h265VisualSample = videoTrackBox.GetMdia().GetMinf().GetStbl().GetStsd().Children.FirstOrDefault(x => x.Type == VisualSampleEntryBox.TYPE6 || x.Type == VisualSampleEntryBox.TYPE7) as VisualSampleEntryBox;
51+
if(h265VisualSample != null)
52+
{
53+
server.VideoTrack = new SharpRTSPServer.H265Track();
54+
}
55+
else
56+
{
57+
throw new NotSupportedException("No supported video found!");
58+
}
59+
}
4060
}
4161

4262
if (audioTrackBox != null)
4363
{
4464
audioTrackId = fmp4.FindAudioTrackID().First();
4565
audioSampleEntry = audioTrackBox.GetAudioSampleEntryBox();
66+
67+
var aac = audioTrackBox.GetMdia().GetMinf().GetStbl().GetStsd().Children.FirstOrDefault(x => x.Type == AudioSampleEntryBox.TYPE3) as AudioSampleEntryBox;
68+
if (aac != null)
69+
{
70+
var audioConfigDescriptor = audioSampleEntry.GetAudioSpecificConfigDescriptor();
71+
audioSamplingRate = audioConfigDescriptor.GetSamplingFrequency();
72+
server.AudioTrack = new SharpRTSPServer.AACTrack(await audioConfigDescriptor.ToBytes(), audioSamplingRate, audioConfigDescriptor.ChannelConfiguration);
73+
}
4674
}
4775
}
4876
}
@@ -56,15 +84,20 @@
5684
{
5785
var videoSamplingRate = SharpRTSPServer.H264Track.DEFAULT_CLOCK;
5886
var videoSampleDuration = videoSamplingRate / videoFrameRate;
59-
var videoTrack = parsedMDAT[videoTrackId];
60-
var rtspVideoTrack = new SharpRTSPServer.H264Track();
61-
server.VideoTrack = rtspVideoTrack;
87+
var videoTrack = parsedMDAT[videoTrackId];
6288
videoTimer = new Timer(videoSampleDuration * 1000 / videoSamplingRate);
6389
videoTimer.Elapsed += (s, e) =>
6490
{
6591
if (videoIndex == 0)
6692
{
67-
rtspVideoTrack.SetParameterSets(videoTrack[0][0], videoTrack[0][1]);
93+
if (server.VideoTrack is SharpRTSPServer.H264Track h264VideoTrack)
94+
{
95+
h264VideoTrack.SetParameterSets(videoTrack[0][0], videoTrack[0][1]);
96+
}
97+
else if (server.VideoTrack is SharpRTSPServer.H265Track h265VideoTrack)
98+
{
99+
h265VideoTrack.SetParameterSets(videoTrack[0][0], videoTrack[0][1], videoTrack[0][2]);
100+
}
68101
videoIndex++;
69102
}
70103

@@ -81,11 +114,6 @@
81114
{
82115
var audioSampleDuration = SharpMp4.AACTrack.AAC_SAMPLE_SIZE;
83116
var audioTrack = parsedMDAT[audioTrackId];
84-
var audioConfigDescriptor = audioSampleEntry.GetAudioSpecificConfigDescriptor();
85-
var audioSamplingRate = audioConfigDescriptor.GetSamplingFrequency();
86-
var rtspAudioTrack = new SharpRTSPServer.AACTrack(audioSamplingRate, audioConfigDescriptor.ChannelConfiguration);
87-
rtspAudioTrack.SetConfigDescriptor(await audioConfigDescriptor.ToBytes());
88-
server.AudioTrack = rtspAudioTrack;
89117
audioTimer = new Timer(audioSampleDuration * 1000 / audioSamplingRate);
90118
audioTimer.Elapsed += (s, e) =>
91119
{

0 commit comments

Comments
 (0)