微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何让 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 举报,一经查实,本站将立刻删除。