Reputation: 116
I have a program based on the FFMPEG libraries, to add KLV data to a video stream. When I try to sent the output to an RTSP server (rtsp-simple-server), I get a 400 response.
The apparent reason is that the SDP data for the KLV stream is missing the rtpmap.
I would like to add the missing data either by setting the proper parameters in the contexts, or by specifying the data explicitly.
This is the ANNOUNCE captured with Wireshark
ANNOUNCE rtsp://0.0.0.0:8554/test RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: Lavf58.29.100
Content-Length: 270
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
a=tool:libavformat 58.29.100
m=video 0 RTP/AVP 96
b=AS:10000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
a=control:streamid=0
m=application 0 RTP/AVP 97
b=AS:90
a=control:streamid=1
Code fragment for initializing the data stream:
AVStream* data_track = avformat_new_stream(muxer, nullptr);
if (data_track == nullptr) {
LOG_ERROR << "failed to open data output stream";
return nullptr;
}
muxer->oformat->video_codec = AV_CODEC_ID_H264;
AVCodec *klvEncoder = avcodec_find_encoder(AV_CODEC_ID_SMPTE_KLV);
if (klvEncoder == nullptr) {
klvEncoder = avcodec_find_encoder(AV_CODEC_ID_BIN_DATA);
}
if (klvEncoder == nullptr) {
klvEncoder = avcodec_find_encoder(AV_CODEC_ID_TEXT);
}
if (klvEncoder != nullptr) {
klvEncoderContext = avcodec_alloc_context3(encoder);
avcodec_parameters_from_context(data_track->codecpar, encoderContext);
} else {
avcodec_parameters_copy(data_track->codecpar, pVideoStream->codecpar);
}
data_track->codecpar->codec_tag = KLV_ID_TAG;
data_track->codecpar->codec_type = AVMEDIA_TYPE_DATA;
data_track->codecpar->codec_id = AV_CODEC_ID_SMPTE_KLV;
data_track->codecpar->bit_rate = 90000;
data_track->codecpar->format = AV_SAMPLE_FMT_U8;
data_track->stream_identifier = KLV_ID_TAG;
data_track->id = 0x101;
data_track->time_base = video_track->time_base;
data_track->avg_frame_rate = video_track->time_base;
Upvotes: 1
Views: 482