Skip to content

Commit 9b1301a

Browse files
committed
fix srt bridge hevc to rtmp error.
try to fix #4428. Cause: rtmp do not support hevc, rtmp enhanced do.
1 parent 7c1e87e commit 9b1301a

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

trunk/src/app/srs_app_srt_source.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ srs_error_t SrsSrtFrameBuilder::check_vps_sps_pps_change(SrsTsMessage *msg)
671671

672672
// ts tbn to flv tbn.
673673
uint32_t dts = (uint32_t)(msg->dts / 90);
674+
uint32_t pts = (uint32_t)(msg->pts / 90);
674675

675676
std::string sh;
676677
SrsUniquePtr<SrsRawHEVCStream> hevc(new SrsRawHEVCStream());
@@ -682,10 +683,16 @@ srs_error_t SrsSrtFrameBuilder::check_vps_sps_pps_change(SrsTsMessage *msg)
682683
// h265 packet to flv packet.
683684
char *flv = NULL;
684685
int nb_flv = 0;
685-
if ((err = hevc->mux_avc2flv(sh, SrsVideoAvcFrameTypeKeyFrame, SrsVideoAvcFrameTraitSequenceHeader, dts, dts, &flv, &nb_flv)) != srs_success) {
686-
return srs_error_wrap(err, "avc to flv");
687-
}
688-
686+
if ((err = hevc->mux_avc2flv_enhanced(sh,
687+
SrsVideoAvcFrameTypeKeyFrame,
688+
SrsVideoHEVCFrameTraitPacketTypeSequenceStart,
689+
dts,
690+
pts,
691+
&flv,
692+
&nb_flv)) != srs_success) {
693+
return srs_error_wrap(err, "hevc sh to flv");
694+
}
695+
689696
SrsMessageHeader header;
690697
header.initialize_video(nb_flv, dts, video_streamid_);
691698
SrsRtmpCommonMessage rtmp;
@@ -713,8 +720,6 @@ srs_error_t SrsSrtFrameBuilder::on_hevc_frame(SrsTsMessage *msg, vector<pair<cha
713720

714721
// ts tbn to flv tbn.
715722
uint32_t dts = (uint32_t)(msg->dts / 90);
716-
uint32_t pts = (uint32_t)(msg->pts / 90);
717-
int32_t cts = pts - dts;
718723

719724
// for IDR frame, the frame is keyframe.
720725
SrsVideoAvcFrameType frame_type = SrsVideoAvcFrameTypeInterFrame;
@@ -736,16 +741,9 @@ srs_error_t SrsSrtFrameBuilder::on_hevc_frame(SrsTsMessage *msg, vector<pair<cha
736741
SrsBuffer payload(rtmp.payload(), rtmp.size());
737742

738743
// Write 5bytes video tag header.
739-
740-
// @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78
741-
// Frame Type, Type of video frame.
742-
// CodecID, Codec Identifier.
743-
// set the rtmp header
744-
payload.write_1bytes((frame_type << 4) | SrsVideoCodecIdHEVC);
745-
// hevc_type: nalu
746-
payload.write_1bytes(0x01);
747-
// composition time
748-
payload.write_3bytes(cts);
744+
// @see: https://veovera.org/docs/enhanced/enhanced-rtmp-v1.pdf, page 8
745+
payload.write_1bytes(SRS_FLV_IS_EX_HEADER | (frame_type << 4) | SrsVideoHEVCFrameTraitPacketTypeCodedFramesX);
746+
payload.write_4bytes(0x68766331); // 'h' 'v' 'c' '1'
749747

750748
// Write video nalus.
751749
for (size_t i = 0; i != ipb_frames.size(); ++i) {

0 commit comments

Comments
 (0)