FFMPEG如何解码播放通过socket接收的网络码流(h264)?
是否有兄弟研究过, 使用FFMPEG做一个播放器, 使其可以接受和播放网络(UDP)发过来的码流(裸码流,h264编码)?
其实,目前解决不了的问题是,FFMPEG是否支持播放内存buffer中的裸码流?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果你的h.264流是每一帧存储在一个nalu里面,有一个可行的办法:
先手工指定AVCodec 和AVCodecContext为h.264解码器。
接收到SPS PPS的时候(一般码流开始就是),先存储起来,等收到后面的IDR帧以后,连在一起传给avcodec_decode_video2(当然得放到AVPacket里面传),就能成功解码了。
解码一帧成功以后你会看到AVCodecContext里面一些变量已经设置好了,比如width和height。
代码:(假设包含SPS、PPS、IDR帧的数据块保存在videoData中,长度为len。)
是可以的,也在实际的项目中验证了。大概的思路是这样的,从socket收到h264的裸数据之后,通过ffmpeg的av_parser_parse2接口进行组帧,再用avcodec_decode_video2接口解码就可以了,解码过后就是显示了。
http://hi.baidu.com/mingyuejingque/item/34db89a7d16fc9706cd4559d
老衲的博客里有抄袭了这种例子。
我很确信ffmpeg可以接受pipe进来的文件流
很简单的, 多看看ffmpeg的源码吧...
AVCodecContext* ctx = avcodec_alloc_context();
ctx->extradata = new uint8_t[sps_pps_len];
ctx->extradata_size = sps_pps_len;
memcpy(ctx->extradata, sps_pps, sps_pps_len);
AVCodec* dec = avcodec_find_decoder(CODEC_ID_H264);
avcodec_open(ctx, dec);
然后就是avcodec_decode_video....