H.264码流结构

a、对照:H.263的码流结构

H.263定义的码流结构是分级结构,共四层。自上而下分别为:图像层(picture layer)、块组层(GOB layer)、宏块层(macroblock layer)和块层(block layer)

 

PSC

TR

PTYPE

PQUANT

CPM

PSBI

TRB

DBQUANT

PEI

 

 

 

PSPARE

PEI

 

Group of Blocks

ESTUF

EOS

PSTUF

1.1     图像层结构

 

GSTUF

GBSC

GN

GSBI

GFID

GQUANT

Macroblock Data

1.2     GOB层结构

 

COD

MCBPC

MODB

CBPB

CBPY

DQUANT

MVD

 

MVD2

MVD3

MVD4

MVDB

块数据

 

1.3     宏块层结构

 

INTRADC

TCOEF

1.4     块层结构

 

 

 bH.264的码流结构

       H.264的码流结构和H.263的有很大的区别,它采用的不再是严格的分级结构。









 

 

 

 

 

 

 

 

 

 

 

 

 

 

  <script type="text/javascript"> google_ad_client = "pub-7168982058404735"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text_image"; google_ad_channel = ""; google_color_border = "C3D9FF"; google_color_bg = "FFFFFF"; google_color_link = "3D81EE"; google_color_text = "000000"; google_color_url = "008000"; google_ui_features = "rc:0"; google_language = 'zh-CN'; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 1
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 91
    评论
由于FFmpeg是一个C语言库,因此在Java中使用FFmpeg时需要使用Java Native Interface(JNI)来进行交互。以下是一个简单的Java JNI代码示例,用于接收H.264/H.265的码流并将其解码为YUV格式。 首先,需要在Java中定义本地方法,以便调用FFmpeg库中的函数。这可以通过使用“native”关键字来完成。以下是一个示例方法,用于初始化FFmpeg并打开输入文件: ``` public native void init(String input_file); ``` 接下来,需要在C/C++代码中实现这个方法。以下是一个简单的示例,使用FFmpeg API初始化并打开输入文件: ``` JNIEXPORT void JNICALL Java_MyClass_init(JNIEnv *env, jobject obj, jstring input_file) { const char *in_filename = (*env)->GetStringUTFChars(env, input_file, NULL); // Initialize FFmpeg av_register_all(); // Open input file AVFormatContext *format_ctx = NULL; if (avformat_open_input(&format_ctx, in_filename, NULL, NULL) != 0) { printf("Error: Could not open input file\n"); return; } // Find stream information if (avformat_find_stream_info(format_ctx, NULL) < 0) { printf("Error: Could not find stream information\n"); avformat_close_input(&format_ctx); return; } // Close input file avformat_close_input(&format_ctx); (*env)->ReleaseStringUTFChars(env, input_file, in_filename); } ``` 这个方法首先获取Java字符串对象的UTF-8编码,并将其转换为C字符串。然后,它初始化FFmpeg库并打开输入文件。如果打开文件失败,则会输出错误消息并返回。否则,它将查找流信息并关闭输入文件。 接下来,需要定义另一个本地方法,用于读取视频帧。以下是一个示例方法,用于读取下一帧并将其解码为YUV格式: ``` public native byte[] readFrame(); ``` 为了实现这个方法,需要使用FFmpeg的AVPacket和AVFrame结构。以下是一个简单的示例,用于读取下一帧并将其解码为YUV格式: ``` JNIEXPORT jbyteArray JNICALL Java_MyClass_readFrame(JNIEnv *env, jobject obj) { // Read next packet AVPacket packet; av_init_packet(&packet); if (av_read_frame(format_ctx, &packet) < 0) { return NULL; } // Decode packet AVFrame *frame = av_frame_alloc(); int got_frame = 0; if (avcodec_decode_video2(codec_ctx, frame, &got_frame, &packet) < 0) { av_packet_unref(&packet); av_frame_free(&frame); return NULL; } // Convert frame to YUV format AVFrame *yuv_frame = av_frame_alloc(); uint8_t *buffer = (uint8_t *) av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height)); avpicture_fill((AVPicture *) yuv_frame, buffer, AV_PIX_FMT_YUV420P, codec_ctx->width, codec_ctx->height); struct SwsContext *sws_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_YUV420P, SWS_BILINEAR, NULL, NULL, NULL); sws_scale(sws_ctx, (const uint8_t *const *) frame->data, frame->linesize, 0, codec_ctx->height, yuv_frame->data, yuv_frame->linesize); sws_freeContext(sws_ctx); av_frame_free(&frame); // Return YUV frame data as byte array jbyteArray result = (*env)->NewByteArray(env, yuv_frame->linesize[0] * codec_ctx->height * 3 / 2); (*env)->SetByteArrayRegion(env, result, 0, yuv_frame->linesize[0] * codec_ctx->height * 3 / 2, (jbyte *) yuv_frame->data[0]); av_frame_free(&yuv_frame); return result; } ``` 这个方法首先读取下一个AVPacket并将其解码为AVFrame。然后,它将AVFrame转换为YUV格式,使用SWScale库进行高质量的色彩空间转换。最后,它将YUV帧数据作为Java字节数组返回。 这只是一个简单的示例,用于演示如何在Java中使用FFmpeg API接收H.264/H.265的码流。实际应用中,需要更复杂的逻辑来处理不同的编码格式、分辨率和帧率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 91
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值