当前位置: 首页 > news >正文

做亚马逊有哪些网站可以清货网站建设工资 优帮云

做亚马逊有哪些网站可以清货,网站建设工资 优帮云,可以访问任何网站的浏览器,农特产品网站建设合同模板H264简介-也叫做 AVC H.264#xff0c;在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10#xff0c;⼜叫Advanced Video Codec#xff0c;因此常常称为MPEG-4 AVC或直接叫AVC。 原始数据YUV,RGB为什么要压缩-知道就行 在⾳视频传输过程中#xff0c;视频⽂件的传输…H264简介-也叫做 AVC H.264在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10⼜叫Advanced Video Codec因此常常称为MPEG-4 AVC或直接叫AVC。 原始数据YUV,RGB为什么要压缩-知道就行 在⾳视频传输过程中视频⽂件的传输是⼀个极⼤的问题⼀段分辨率为1920*1080每个像素点为RGB占⽤3个字节帧率是25的视频对于传输带宽的要求是 1920x1080x3x25/1024/1024148.315MB/s 这个是每秒的 bytes 数 换成bps则意味着视频每秒带宽为 148.315MB/s x 8 1186.523Mbps 1186.523Mbps这样的速率对于⽹络存储是不可接受的。因此视频压缩和编码技术应运⽽⽣。 H264编码原理 帧内压缩 对于视频⽂件来说视频由单张图⽚帧所组成⽐如每秒25帧但是图⽚帧的像素块之间存在 相似性因此视频帧图像可以进⾏图像压缩H264采⽤了16*16的分块⼤⼩对视频帧图像 进⾏相似⽐较和压缩编码。如下图所示 帧间压缩 H264采⽤了独特的I帧、P帧和B帧策略 来实现连续帧之间的压缩 H264 编码结构解析 H264 除了实现了对视频的压缩处理之外为了⽅便⽹络传输提供了对应的视频编码和分⽚ 策略类似于⽹络数据封装成 IP 帧在 H264 中将其称为组 ( GOP , group of pictures) 、⽚ slice 、宏块 Macroblock 这些⼀起组成了 H264 的码流分层结构 H264 将其组织成为 序列 (GOP) 、图⽚ (pictrue) 、⽚ (Slice) 、宏块 (Macroblock) 、⼦块 (subblock) 五个层次。 GOP 图像组主要⽤作形容⼀个 IDR 帧 到下⼀个 IDR 帧之间的间隔了多少个帧。 H264将视频分为连续的帧进⾏传输在连续的帧之间使⽤I帧、P帧和B帧。 同时对于帧内⽽⾔将图像分块为⽚、宏块和字块进⾏分⽚传输通过这个过程实现对视频⽂件的压缩包装。 IDRInstantaneous Decoding Refresh即时解码刷新 ⼀个序列的第⼀个图像叫做 IDR 图像⽴即刷新图像IDR 图像都是 I 帧图像。 I和IDR帧都使⽤帧内预测。I帧不⽤参考任何帧但是之后的P帧和B帧是有可能参考这个I帧之 前的帧的。 但是在解码的时候I 和 IDR 有区别。举例如下在第一个解码的时候解码到B8的时候可以参考I10前面的P7. 在第二个解码的时候B9 就只能参考 IDR8和 P11,不能参考IDR8之前的帧。 其核⼼作⽤是是为了解码的重同步当解码器解码到 IDR 图像时⽴即将参考帧队列清空将已解码的数据全部输出或抛弃重新查找参数集开始⼀个新的序列。这样如果前⼀个序列出现重⼤错误在这⾥可以获得重新同步的机会。IDR图像之后的图像永远不会使⽤IDR之前的图像的数据来解码。 下⾯是⼀个H264码流的举例从码流的帧分析可以看出来B帧不能被当做参考帧 在假设条件下分析上图假设GOP1 的是每秒25帧也就是一帧画面需要1000/25 40ms. I帧解码的时候时间点在0那么读取下一帧B要依赖于 P接着找下一帧是不是P还不是在找直到找到P也就是说在 找P的时候已经过去了160ms了大致如下 I0 B40 B80 B120 P160 I0 B160 这意味着什么呢在做实时性要求高的场景时最好不要使用B帧 H264编码结构- NALU NAL简介   NAL层即网络抽象层Network Abstraction Layer是为了方便在网络上传输的一种抽象层。一般网络上传输的数据包有大小限制而AVCH264的一帧大小远远大于网络传输的字节大小限制。因此要对AVC的数据流进行拆包将一帧数据拆分为多个包传输。和NAL层相对是VAL层即视频编码层Video Coding Layer NALU就是经过分组后的一个一个数据包。   H.264 原始码流 ( 裸流 ) 是由⼀个接⼀个 NALU 组成。 发I帧之前⾄少要发⼀次SPS和PPS。当分辨率变化的时候要重新发送一次SPS和PPS类似在视频网站上我们将分辨率从720p变成1080p的时候 这个很重要如果遇到我们显示不了图片或者视频的时候应该第一个检查的就是 SPS 和PPS是否有正确的发送。 SPS序列参数集SPS中保存了⼀组编码视频序列(Coded video sequence)的全局参数。 PPS图像参数集对应的是⼀个序列中某⼀幅图像或者某⼏幅图像的参数。 I帧帧内编码帧可独⽴解码⽣成完整的图⽚。 P帧: 前向预测编码帧需要参考其前⾯的⼀个I 或者B 来⽣成⼀张完整的图⽚。 B帧: 双向预测内插编码帧则要参考其前⼀个I或者P帧及其后⾯的⼀个P帧来⽣成⼀张完整的图⽚。 每个NALU StartCode  由一个1字节的NALU头部 一个包含控制信息或编码视频数据的字节流组成。 NALU 结构单元的主体结构如下所示⼀个原始的 H.264 NALU 单元 通常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成。 Start Code ⽤于标示这是⼀个 NALU 单元的开始 必须是00 00 00 01 或 00 00 01 H.264 标准指出当数据流是储存在介质上时在每个 NALU 前添加起始码 0x000001 或 0x00000001 ⽤来指示⼀个 NALU 的起始和终⽌位置 在这样的机制下在码流中检测起始码作为⼀个 NALU 得起始标识当检测到下⼀个起始码时当前NALU 结束。 3 字节的 0x000001 只有⼀种场合下使⽤就是⼀个完整的帧被编为多个 slice ⽚的时 候包含这些 slice 的 NALU 使⽤ 3 字节起始码。其余场合都是 4 字节 0x00000001 的。 NALU Header NALU Header占位8Bit其中三个字段分别为 F 为禁⽌位占 1bit   forbidden_zero_bit 在 H.264 规范中规定了这⼀位必须为 0。 R为重要性指示位占 2个 bit  nal_ref_idc 取 00~11, 似乎指示这个 NALU 的重要性 , 如 00 的 NALU 解码器可以丢弃它⽽不影响图像的回放,0 3 取值越⼤表示当前 NAL 越重要需要优先受到保护。如果当前 NAL是属于参考帧的⽚或是序列参数集或是图像参数集这些重要的单位时本句法元 素必需⼤于0 。 T 为负荷 数据类型 占 5 bit nal_unit_type这个 NALU 单元的类型 ,1 12 由 H.264 使⽤ 24 31 由 H.264 以外的应⽤ 其值如下重点是 5,6,7,8 5      Coded slice of an IDR picture                                  VCL         IDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp( ) 6      Supplemental enhancement information (SEI)                     non-VCL         辅助增强信息 (SEI)sei_rbsp( ) 7      Sequence parameter set                                         non-VCL         序列参数集 seq_parameter_set_rbsp( ) 8      Picture parameter set                                          non-VCL         图像参数集 pic_parameter_set_rbsp( ) 0 Unspecified non-VCL未指定 1 Coded slice of a non-IDR picture VCL⼀个⾮IDR图像的编码条带slice_layer_without_partitioning_rbsp() 2 Coded slice data partition A VCL编码条带数据分割块A slice_data_partition_a_layer_rbsp() 3 Coded slice data partition B VCL编码条带数据分割块B slice_data_partition_b_layer_rbsp( ) 4 Coded slice data partition C VCL编码条带数据分割块C slice_data_partition_c_layer_rbsp( ) 5 Coded slice of an IDR picture VCLIDR图像的编码条带(⽚) slice_layer_without_partitioning_rbsp( ) 6 Supplemental enhancement information (SEI) non-VCL辅助增强信息 (SEI)sei_rbsp( ) 7 Sequence parameter set non-VCL序列参数集 seq_parameter_set_rbsp( ) 8 Picture parameter set non-VCL图像参数集 pic_parameter_set_rbsp( ) 9 Access unit delimiter non-VCL访问单元分隔符 access_unit_delimiter_rbsp( ) 10 End of sequence non-VCL序列结尾 end_of_seq_rbsp( ) 11 End of stream non-VCL流结尾end_of_stream_rbsp( ) 12 Filler data non-VCL填充数据filler_data_rbsp( ) 13 Sequence parameter set extension non-VCL序列参数集扩展seq_parameter_set_extension_rbsp( ) 14 Prefix NAL unit non-VCLNAL 单元前缀 15 Subset sequence parameter set non-VCL子集序列参数集 16 Depth parameter set non-VCL深度参数集 17..18 Reserved non-VCL保留 19 Coded slice of an auxiliary coded picture without partitioning non-VCL未分割的辅助编码图像的编码条带slice_layer_without_partitioning_rbsp( ) 20 Coded slice extension non-VCL编码切片扩展 21 Coded slice extension for depth view components non-VCL深度视图组件的编码切片扩展 22..23 Reserved non-VCL保留 24..31 Unspecified non-VCL未定义NALU Payload  就是 RBSP payload 中文是有效载荷的意思 RBSP 是  Raw Byte Sequence Payloads的缩写 翻译为原始字节序列有效载荷。 这个有效载荷的含义是包含控制信息或编码视频数据的字节流 前面看到有VCL 和 NON-VCL。可以简单的理解为VCL是真正的数据NON-VCL也称为NAL是辅助用的实际的用处将这些真正的VCL数据如果适配到网络环境中。 它的功能 分为两层VCL( 视频编码层 )和NAL( ⽹络提取层 ) VCL 包括核⼼压缩引擎和块宏块和⽚的语法级别定义设计⽬标是尽可能地独⽴于⽹ 络进⾏⾼效的编码 NAL 负责将 VCL 产⽣的⽐特字符串适配到各种各样的⽹络和多元环境中覆盖了所有⽚级 以上的语法级别 H264编码的组织 一个完整的数据包包含多个NALU不同的NALU该如何组织规范中并没有规定因此实际实现比较广泛的有两种格式AnnexB和AVCC。 AnnexB 实际上我们前面学习就是以AnnexB 这种模式学习的。AnnexB是一种比较常见的H264码流格式FFmpeg解封装的H264码流就是这种格式。 AnnexB的格式比较简单每个NALU单元之前通过分隔符0x00 00 00 01或者0x00 00 01区分不同的NALU单元。 对于非VCL和VCL的单元是不区分的都是存储在NALU的Body中。 由于NALU的Body中的数据是压缩数据可能出现start code因此规定RBSP中的0x000000、0x000001、0x000002和0x000003是非法的。如果数据中包含类似的二进制序列需要插入一个“模拟预防”字节0x03来实现使得0x000001变成0x00000301解码时去除即可。 AVCC 另一种常见的存储H.264流的方法是AVCC格式。 也叫mp4 模式⼀般 mp4 mkv 都是 mp4 模式没有 startcode SPS 和 PPS 以及其它信息 被封装在extradata 也叫做 container中每⼀个 frame 前⾯ 4 个字节是这个 frame 的⻓度 AnnexB和 AVCC的转换 很多视频解码器只⽀持 annexb 这种模式因此我们在解析的目标是AVCC的H264 的时候要 做转换 在 ffmpeg 中⽤ h264_mp4toannexb_filter可以做转换。 这里开始的部分还是通过 av_read_frame方法 读取数据 到 AVPacket 的时候 av_read_frame(avformatcontext, avpacket); 然后使用 ffmpeg提供的 av_bsf_send_packet方法将 avpacket 数据塞入注意的是当我们将avpacket 数据塞入的时候av_bsf_send_packet会自己管理内存不管av_bsf_send_packet方法成功或者不成功我们都要调用 av_packet_unref(pkt);将自己的refcount -1 。 int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt); 然后通过 ffmpeg 提供的 av_bsf_receive_packet方法 将avpacket数据改动当我们拿出的时候也要记得调用 av_packet_unref(pkt);将自己的avpacket 的refcount -1。 int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt); 这时候 avpacket 中的数据就从 AVCC转换成 AnnexB的了。就可以直接写入到 自己像存储的.h264文件。 那么 AVBSFContext 是怎么来的呢 参考如下的几步 // 1 找到 h264_mp4toannexb 的过滤器 const AVBitStreamFilter *bsfilter av_bsf_get_by_name(h264_mp4toannexb); AVBSFContext *bsf_ctx NULL; // 2 初始化过滤器上下⽂ av_bsf_alloc(bsfilter, bsf_ctx); //AVBSFContext; 该av_bsf_alloc方法的说明如下* Allocate a context for a given bitstream filter. The caller must fill in the* context parameters as described in the documentation and then call* av_bsf_init() before sending any data to the filter.// 3 添加解码器属性 avcodec_parameters_copy(bsf_ctx-par_in, ifmt_ctx-streams[videoindex]-codecpar);av_bsf_init(bsf_ctx); 注意的是如果文件是TS流可以不使用该方法如果使用也不会有问题。 但是如果文件是mp4文件或者flv文件则要使用该方法如果不使用会有问题 整体code如下 #include stdio.h #include libavutil/log.h #include libavformat/avio.h #include libavformat/avformat.h #includelibavcodec/bsf.hstatic char err_buf[128] {0}; static char* av_get_err(int errnum) {av_strerror(errnum, err_buf, 128);return err_buf; }/* AvCodecContext-extradata[]中为nalu长度 * codec_extradata: * 1, 64, 0, 1f, ff, e1, [0, 18], 67, 64, 0, 1f, ac, c8, 60, 78, 1b, 7e, * 78, 40, 0, 0, fa, 40, 0, 3a, 98, 3, c6, c, 66, 80, * 1, [0, 5],68, e9, 78, bc, b0, 0, *///ffmpeg -i 2018.mp4 -codec copy -bsf:h264_mp4toannexb -f h264 tmp.h264 //ffmpeg 从mp4上提取H264的nalu h int main(int argc, char **argv) {AVFormatContext *ifmt_ctx NULL;int videoindex -1;AVPacket *pkt NULL;int ret -1;int file_end 0; // 文件是否读取结束if(argc 3){printf(usage inputfile outfile\n);return -1;}FILE *outfpfopen(argv[2],wb);printf(in:%s out:%s\n, argv[1], argv[2]);// 分配解复用器的内存使用avformat_close_input释放ifmt_ctx avformat_alloc_context();if (!ifmt_ctx){printf([error] Could not allocate context.\n);return -1;}// 根据url打开码流并选择匹配的解复用器ret avformat_open_input(ifmt_ctx,argv[1], NULL, NULL);if(ret ! 0){printf([error]avformat_open_input: %s\n, av_get_err(ret));return -1;}// 读取媒体文件的部分数据包以获取码流信息ret avformat_find_stream_info(ifmt_ctx, NULL);if(ret 0){printf([error]avformat_find_stream_info: %s\n, av_get_err(ret));avformat_close_input(ifmt_ctx);return -1;}// 查找出哪个码流是video/audio/subtitlesvideoindex -1;// 推荐的方式videoindex av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);if(videoindex -1){printf(Didnt find a video stream.\n);avformat_close_input(ifmt_ctx);return -1;}// 分配数据包pkt av_packet_alloc();av_init_packet(pkt);// 1 获取相应的比特流过滤器//FLV/MP4/MKV等结构中h264需要h264_mp4toannexb处理。添加SPS/PPS等信息。// FLV封装时可以把多个NALU放在一个VIDEO TAG中,结构为4B NALU长度NALU14B NALU长度NALU2...,// 需要做的处理把4B长度换成00000001或者000001const AVBitStreamFilter *bsfilter av_bsf_get_by_name(h264_mp4toannexb);AVBSFContext *bsf_ctx NULL;// 2 初始化过滤器上下文av_bsf_alloc(bsfilter, bsf_ctx); //AVBSFContext;// 3 添加解码器属性avcodec_parameters_copy(bsf_ctx-par_in, ifmt_ctx-streams[videoindex]-codecpar);av_bsf_init(bsf_ctx);file_end 0;while (0 file_end){if((ret av_read_frame(ifmt_ctx, pkt)) 0){// 没有更多包可读file_end 1;printf(read file end: ret:%d\n, ret);}if(ret 0 pkt-stream_index videoindex){ #if 0int input_size pkt-size;int out_pkt_count 0;if (av_bsf_send_packet(bsf_ctx, pkt) ! 0) // bitstreamfilter内部去维护内存空间{av_packet_unref(pkt); // 你不用了就把资源释放掉continue; // 继续送}av_packet_unref(pkt); // 释放资源while(av_bsf_receive_packet(bsf_ctx, pkt) 0){out_pkt_count;// printf(fwrite size:%d\n, pkt-size);size_t size fwrite(pkt-data, 1, pkt-size, outfp);if(size ! pkt-size){printf(fwrite failed- write:%u, pkt_size:%u\n, size, pkt-size);}av_packet_unref(pkt);}if(out_pkt_count 2){printf(cur pkt(size:%d) only get 1 out pkt, it get %d pkts\n,input_size, out_pkt_count);} #else // TS流可以直接写入size_t size fwrite(pkt-data, 1, pkt-size, outfp);if(size ! pkt-size){printf(fwrite failed- write:%u, pkt_size:%u\n, size, pkt-size);}av_packet_unref(pkt); #endif}else{if(ret 0)av_packet_unref(pkt); // 释放内存}}if(outfp)fclose(outfp);if(bsf_ctx)av_bsf_free(bsf_ctx);if(pkt)av_packet_free(pkt);if(ifmt_ctx)avformat_close_input(ifmt_ctx);printf(finish\n);return 0; }这里我们要复习一下  av_packet_unref(pkt);和 av_packet_free(pkt)的区别
http://www.hkea.cn/news/14388312/

相关文章:

  • 做常识的网站中国核工业二三建设有限公司招聘
  • 网站建设详细的步骤有哪些王也头像 呆萌
  • 一个好的营销型网站模板同城新闻app有哪些
  • 介绍个人网站的ppt怎么做衡阳网站建设公司地址
  • 一个网站有多少gicp备案管理系统
  • 公司网站注销流程精准广告投放
  • wordpress建站给媒体分类做一整套网站需要什么
  • 快站公众号工具wordpress 页面很窄
  • 网站上的动态效果怎么做的搜索引擎优化百度
  • 做网站最大可以做多少g中国采购与招标网官网
  • 素材网站整站下载wordpress友情链接显示个数
  • discuz做地方门户网站微信小程序建站
  • php网站开发案例教程如何做家教网站
  • 工业设计招聘信息网站徐州英才网
  • 网站建设小程序山东wordpress主题logo
  • 友情链接互换网站下载官方网站
  • 做外贸免费的网站有哪些电子商务与网站建设策划书
  • 重庆市企业网站建设wordpress+禁用版本
  • 手机可以创建网站吗网站建设添加视频
  • 保定网站建设方案做电影平台网站怎么赚钱吗
  • 沙朗镇做网站公司企业推广方案范例
  • 济南营销型网站公司分销商城小程序
  • 网站建设功能报价极客邦
  • 酷站是什么网站营销型网站结构
  • 自己做网站优化苏州城乡和住房建设局网站首页
  • 网站用户角色wordpress悬停图
  • 商业网站导航怎么做WordPress mip 评论框
  • 做期货资讯网站网站建设这一行业怎样
  • 做网站学习什么漂亮logo图片
  • 企业管理体系包含哪些内容seo是啥职业