H264 中获取I 帧,B 帧,P 帧

http://blog.csdn.net/zhuweigangzwg/article/details/44152239
常用的H.265码流解析开源库有: 1. FFmpeg:FFmpeg是一个开源的跨平台音视频解决方案,支持包括H.265在内的多种音视频格式的解码和编码。它提供了一套完整的API接口,可以方便地进行H.265码流解析和处理。 2. x265:x265是一个开源的H.265编码器,支持从YUV文件或者其他编码格式的视频文件提取H.265码流。它提供了一些命令行工具,可以方便地进行码流解析和处理。 下面是使用FFmpeg库获取H.265流的I、P、B和SPS、PPS的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <libavcodec/avcodec.h> int main(int argc, char** argv) { AVCodec* codec; AVCodecContext* codec_ctx; AVFrame* frame; AVPacket pkt; int ret, got_frame; // Initialize FFmpeg library av_register_all(); avcodec_register_all(); // Open H.265 codec codec = avcodec_find_decoder(AV_CODEC_ID_HEVC); if (!codec) { fprintf(stderr, "Codec not found\n"); exit(EXIT_FAILURE); } // Allocate codec context codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { fprintf(stderr, "Could not allocate codec context\n"); exit(EXIT_FAILURE); } // Open codec context if (avcodec_open2(codec_ctx, codec, NULL) < 0) { fprintf(stderr, "Could not open codec\n"); exit(EXIT_FAILURE); } // Allocate frame frame = av_frame_alloc(); if (!frame) { fprintf(stderr, "Could not allocate frame\n"); exit(EXIT_FAILURE); } // Initialize packet av_init_packet(&pkt); // Read H.265 stream from file FILE* fp = fopen("input.h265", "rb"); if (!fp) { fprintf(stderr, "Could not open input file\n"); exit(EXIT_FAILURE); } // Parse H.265 stream while (1) { // Read packet from file ret = fread(pkt.data, 1, 4096, fp); if (ret == 0) { break; } pkt.size = ret; // Decode packet ret = avcodec_decode_video2(codec_ctx, frame, &got_frame, &pkt); if (ret < 0) { fprintf(stderr, "Error decoding packet\n"); exit(EXIT_FAILURE); } if (got_frame) { // Process frame if (frame->pict_type == AV_PICTURE_TYPE_I) { printf("I frame\n"); } else if (frame->pict_type == AV_PICTURE_TYPE_P) { printf("P frame\n"); } else if (frame->pict_type == AV_PICTURE_TYPE_B) { printf("B frame\n"); } if (frame->metadata) { // Process SPS, PPS const char* key = "H264_PPS"; AVDictionaryEntry* entry = av_dict_get(frame->metadata, key, NULL, 0); if (entry) { printf("PPS frame\n"); } key = "H264_SPS"; entry = av_dict_get(frame->metadata, key, NULL, 0); if (entry) { printf("SPS frame\n"); } } } } // Clean up resources fclose(fp); av_frame_free(&frame); avcodec_close(codec_ctx); av_free(codec_ctx); return 0; } ``` 该示例代码使用FFmpeg库解析H.265流,并根据类型输出I、P、B以及SPS、PPS的信息。其,avcodec_decode_video2()函数用于解码H.265码流,AV_PICTURE_TYPE_I、AV_PICTURE_TYPE_P、AV_PICTURE_TYPE_B分别代表I、P、B,frame->metadata用于获取SPS、PPS的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值