FFMPEG如何解码播放通过socket接收的网络码流(h264)?

发布于 2021-11-26 13:56:48 字数 117 浏览 822 评论 5

是否有兄弟研究过, 使用FFMPEG做一个播放器, 使其可以接受和播放网络(UDP)发过来的码流(裸码流,h264编码)?

其实,目前解决不了的问题是,FFMPEG是否支持播放内存buffer中的裸码流?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

反话 2021-11-29 04:09:22

如果你的h.264流是每一帧存储在一个nalu里面,有一个可行的办法:

先手工指定AVCodec 和AVCodecContext为h.264解码器。

接收到SPS PPS的时候(一般码流开始就是),先存储起来,等收到后面的IDR帧以后,连在一起传给avcodec_decode_video2(当然得放到AVPacket里面传),就能成功解码了。

解码一帧成功以后你会看到AVCodecContext里面一些变量已经设置好了,比如width和height。

代码:(假设包含SPS、PPS、IDR帧的数据块保存在videoData中,长度为len。)

AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264);
AVCodecContext *codecCtx = avcodec_alloc_context3(codec);
avcodec_open2(codecCtx, codec, nil);
char *videoData;
int len;
AVFrame *frame = av_frame_alloc();
AVPacket packet;
av_new_packet(&packet, len);
memcpy(packet.data, videoData, len);
int ret, got_picture;
ret = avcodec_decode_video2(codecCtx, frame, &got_picture, &packet);
if (ret > 0){
    if(got_picture){
    //进行下一步的处理
    }
}

贱贱哒 2021-11-28 07:03:10

是可以的,也在实际的项目中验证了。大概的思路是这样的,从socket收到h264的裸数据之后,通过ffmpeg的av_parser_parse2接口进行组帧,再用avcodec_decode_video2接口解码就可以了,解码过后就是显示了。

爱的故事 2021-11-28 03:09:34

http://hi.baidu.com/mingyuejingque/item/34db89a7d16fc9706cd4559d

老衲的博客里有抄袭了这种例子。

离不开的别离 2021-11-27 15:40:13

我很确信ffmpeg可以接受pipe进来的文件流

带上头具痛哭 2021-11-27 08:44:31

很简单的, 多看看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....  

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文