我有一个基于 FFMPEG 库的程序,用于将 KLV 数据添加到视频流中。当我尝试将输出发送到 RTSP 服务器 (rtsp-simple-server) 时,我收到 400 响应。
明显的原因是 KLV 流的 SDP 数据缺少 rtpmap。
我想通过在上下文中设置适当的参数或明确指定数据来添加丢失的数据。
这是使用 Wireshark 捕获的 ANNOUNCE
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
初始化数据流的代码片段:
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;