如何让 ffmpeg 为数据流输出正确的 SDP 数据

问题描述

我有一个基于 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;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)