ffmpeg 发rtp流的问题

Chuang_Shang_Deng_NI 2015-11-02 10:33:42
我从网络接受rtp数据 然后再发出去.原先是直接转发,vlc没法播放(通过rtsp)。。
后来考虑用ffmpeg,先探测输入流,用av_read_frame读取AVPacket,然后通过av_write_frame发出去。。




//输入相关的
AVInputFormat *inputFormat = nullptr;
AVFormatContext *inputFormatContext = nullptr;
AVIOContext *inputIoContext;
AVCodecContext *inputCodecContext;

AVCodec *codec;


//输入相关的
AVFormatContext* outputFormatContext;
AVOutputFormat* outputFormat;
AVStream* outputStream;
AVCodecContext* outCodecContext;



//探测输入码流 (略)

//构造输出
outputFormatContext = avformat_alloc_context();
outputFormatContext->oformat = av_guess_format("rtp", nullptr, nullptr);
#if 0
sprintf_s(outputFormatContext->filename, sizeof(outputFormatContext->filename), "rtp://%s:%d", "10.78.4.111", 12121);
#else
sprintf_s(outputFormatContext->filename, sizeof(outputFormatContext->filename), "rtp://%s:%d", "127.0.0.1", 12121);
#endif
avio_open(&outputFormatContext->pb, outputFormatContext->filename, AVIO_FLAG_WRITE);

outputStream = avformat_new_stream(outputFormatContext, codec);

outCodecContext = outputStream->codec;

avcodec_get_context_defaults3(outCodecContext, codec);
outCodecContext->codec_id = inputCodecContext->codec_id;
outCodecContext->width = inputCodecContext->width;
outCodecContext->height = inputCodecContext->height;
outCodecContext->time_base.den = inputCodecContext->time_base.den;
outCodecContext->pix_fmt = inputCodecContext->pix_fmt;

if (outputFormatContext->oformat->flags & AVFMT_GLOBALHEADER)
outCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;

//av_opt_set(outCodecContext->priv_data, "preset", "ultrafast", 0);
//av_opt_set(outCodecContext->priv_data, "tune", "stillimage,fastdecode,zerolatency", 0);
//av_opt_set(outCodecContext->priv_data, "x264opts", "crf=26:vbv-maxrate=728:vbv-bufsize=364:keyint=25", 0);

//复制outCodecContext->extradata 据说里面包含了sps pps的东西
outCodecContext->extradata = (unsigned char*)av_malloc(inputCodecContext->extradata_size);
memcpy(outCodecContext->extradata, inputCodecContext->extradata, inputCodecContext->extradata_size);
outCodecContext->extradata_size = inputCodecContext->extradata_size;
avcodec_open2(outCodecContext, codec, nullptr);
avformat_write_header(outputFormatContext, nullptr);

char sdp[2048];
av_sdp_create(&outputFormatContext, 1, sdp, sizeof(sdp));

//发数据
for (;;)
{
if (av_read_frame(inputFormatContext, &pkt) >= 0)
{
if (pkt.stream_index == videoindex)
{

//static int b = 0;
//printf("读到数据 %d\n",b++);

av_write_frame(outputFormatContext, &pkt);
//fwrite(pkt.data, pkt.size, 1, a);
//fflush(a);
}
}
else
{
break;
}
}

生成的 sdp为
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 56.40.101
m=video 12121 RTP/AVP 96
b=AS:200
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0KAKJpmA8ARPy4C3AQEBQAAAwPoAADDUOhgAe4gAAX14LvLjQwAPcQAAL68F3lwoA==,aM44gA==; profile-level-id=428028
保存到文件,然后拖到vlc,接着发流,vlc一点反应没有
我看抓包 除了rtp头之外,后面的数据直接就是7c01、7c41、7c81之类的(应该是a分片吧)

我还要做啥vlc才能播?
...全文
6646 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 Chuang_Shang_Deng_NI 的回复:
改成rtsp了,把生成的sdp放到rtsp 的play回复里,其他不变。。 用rtsp来点播,vlc和ffplay都可以播放了
嗨,请问ffmpeg怎么推rtsp流,,我的总是推不了··
  • 打赏
  • 举报
回复
这他喵的几个意思,刚试了下ffplay,是可以播放的
  • 打赏
  • 举报
回复
引用 3 楼 wtx_sonery 的回复:
恭喜。。蹭点分
  • 打赏
  • 举报
回复
恭喜。。蹭点分
  • 打赏
  • 举报
回复
改成rtsp了,把生成的sdp放到rtsp 的play回复里,其他不变。。 用rtsp来点播,vlc和ffplay都可以播放了

2,542

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧