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

广西建设厅微信网站国家网站集约化建设试点方案

广西建设厅微信网站,国家网站集约化建设试点方案,优化设计电子课本,离开此网站系统可能不会保存您做的更改一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式#xff08;像素格式#xff09;、分辨率、帧率信息#xff1a; ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 #xff08;…一、引言 通过FFmpeg命令可以获取到PS文件/PS流的视频压缩编码格式、色彩格式像素格式、分辨率、帧率信息 ./ffmpeg -i XXX.ps 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。   二、视频压缩编码格式 一FFmpeg获取PS流的视频压缩编码格式的原理 FFmpeg获取PS文件/PS流的视频压缩编码格式是从PES packet的有效载荷即ES流数据中获取的。从《音视频入门基础MPEG2-TS专题18——PES流简介》可以知道PES packet的PES packet header里面存在一个stream_id属性指定ES流的类型和编号。但是仅根据这个stream_id属性是无法判断视频压缩编码格式的 所以要获取视频压缩编码格式得从PES packet的有效载荷中获取。用Elecard Stream Analyzer工具可以看到如果PS流的视频压缩编码格式为H.264那PES packet的有效载荷中携带的就是以0x000001或0x00000001作为起始码的AnnexB格式的H.264码流关于AnnexB可以参考《音视频入门基础H.264专题3——EBSP, RBSP和SODB》 所以这时候就可以通过解析PES packet的有效载荷即ES流来获取视频压缩编码格式。下面讲解相关代码。 二FFmpeg获取PS流的视频压缩编码格式的实现 由《音视频入门基础MPEG2-PS专题5——FFmpeg源码中解析PS流中的PES流的实现》可以知道FFmpeg源码中通过mpegps_read_pes_header函数解析PS流中的一个PES packet将其PES packet header里面的信息解析出来。而在调用完mpegps_read_pes_header函数后指针s-pb.buf_ptr会指向该PES packet的有效载荷如果PS流的视频压缩编码格式为H.264那就是指向以0x000001或0x00000001作为起始码的AnnexB格式的H.264码流 然后在mpegps_read_packet函数中会通过av_get_packet函数将s-pb.buf_ptr指向的H.264码流数据保存到pkt-data指向的缓冲区中关于av_get_packet函数的用法可以参考《FFmpeg源码append_packet_chunked、av_get_packet、av_append_packet函数分析》 static int mpegps_read_packet(AVFormatContext *s,AVPacket *pkt) { //...len mpegps_read_pes_header(s, dummy_pos, startcode, pts, dts); //...ret av_get_packet(s-pb, pkt, len); //... } 之后在probe_codec函数中会通过语句memcpy(pd-buf pd-buf_size, pkt-data, pkt-size) 将上述H.264码流数据从pkt-data拷贝到pd-buf中 static int probe_codec(AVFormatContext *s, AVStream *st, const AVPacket *pkt) { //...if (sti-request_probe 0) {//...AVProbeData *const pd sti-probe_data;int end;av_log(s, AV_LOG_DEBUG, probing stream %d pp:%d\n, st-index, sti-probe_packets);--sti-probe_packets;if (pkt) {uint8_t *new_buf av_realloc(pd-buf, pd-buf_sizepkt-sizeAVPROBE_PADDING_SIZE);if (!new_buf) {av_log(s, AV_LOG_WARNING,Failed to reallocate probe buffer for stream %d\n,st-index);goto no_packet;}pd-buf new_buf;memcpy(pd-buf pd-buf_size, pkt-data, pkt-size);pd-buf_size pkt-size;memset(pd-buf pd-buf_size, 0, AVPROBE_PADDING_SIZE);}//...} //... } 然后probe_codec函数中会调用set_codec_from_probe_data函数set_codec_from_probe_data函数的定义如下 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,AVProbeData *pd) {static const struct {const char *name;enum AVCodecID id;enum AVMediaType type;} fmt_id_type[] {{ aac, AV_CODEC_ID_AAC, AVMEDIA_TYPE_AUDIO },{ ac3, AV_CODEC_ID_AC3, AVMEDIA_TYPE_AUDIO },{ aptx, AV_CODEC_ID_APTX, AVMEDIA_TYPE_AUDIO },{ dts, AV_CODEC_ID_DTS, AVMEDIA_TYPE_AUDIO },{ dvbsub, AV_CODEC_ID_DVB_SUBTITLE, AVMEDIA_TYPE_SUBTITLE },{ dvbtxt, AV_CODEC_ID_DVB_TELETEXT, AVMEDIA_TYPE_SUBTITLE },{ eac3, AV_CODEC_ID_EAC3, AVMEDIA_TYPE_AUDIO },{ h264, AV_CODEC_ID_H264, AVMEDIA_TYPE_VIDEO },{ hevc, AV_CODEC_ID_HEVC, AVMEDIA_TYPE_VIDEO },{ loas, AV_CODEC_ID_AAC_LATM, AVMEDIA_TYPE_AUDIO },{ m4v, AV_CODEC_ID_MPEG4, AVMEDIA_TYPE_VIDEO },{ mjpeg_2000, AV_CODEC_ID_JPEG2000, AVMEDIA_TYPE_VIDEO },{ mp3, AV_CODEC_ID_MP3, AVMEDIA_TYPE_AUDIO },{ mpegvideo, AV_CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },{ truehd, AV_CODEC_ID_TRUEHD, AVMEDIA_TYPE_AUDIO },{ evc, AV_CODEC_ID_EVC, AVMEDIA_TYPE_VIDEO },{ vvc, AV_CODEC_ID_VVC, AVMEDIA_TYPE_VIDEO },{ 0 }};int score;const AVInputFormat *fmt av_probe_input_format3(pd, 1, score);FFStream *const sti ffstream(st);if (fmt) {av_log(s, AV_LOG_DEBUG,Probe with size%d, packets%d detected %s with score%d\n,pd-buf_size, s-max_probe_packets - sti-probe_packets,fmt-name, score);for (int i 0; fmt_id_type[i].name; i) {if (!strcmp(fmt-name, fmt_id_type[i].name)) {if (fmt_id_type[i].type ! AVMEDIA_TYPE_AUDIO st-codecpar-sample_rate)continue;if (sti-request_probe score st-codecpar-codec_id ! fmt_id_type[i].id)continue;st-codecpar-codec_id fmt_id_type[i].id;st-codecpar-codec_type fmt_id_type[i].type;sti-need_context_update 1;return score;}}}return 0; } 可以看到set_codec_from_probe_data函数中调用了av_probe_input_format3函数来推测pd-buf中的码流的格式。关于av_probe_input_format3函数的用法可以参考《FFmpeg源码av_probe_input_format3函数和AVInputFormat结构体分析FFmpeg源码5.0.3版本》。对于H.264裸流av_probe_input_format3函数中就是调用了h264_probe函数来检测这段码流是否为AnnexB格式的H.264裸流具体可以参考《音视频入门基础H.264专题16——FFmpeg源码中判断某文件是否为H.264裸流文件的实现》。 判断出这段码流为H.264裸流后set_codec_from_probe_data函数中会执行语句st-codecpar-codec_id   fmt_id_type[i].id让AVCodecParameters的codec_id得到视频压缩编码格式 static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,AVProbeData *pd) { //...if (fmt) { //...for (int i 0; fmt_id_type[i].name; i) {if (!strcmp(fmt-name, fmt_id_type[i].name)) {if (fmt_id_type[i].type ! AVMEDIA_TYPE_AUDIO st-codecpar-sample_rate)continue;if (sti-request_probe score st-codecpar-codec_id ! fmt_id_type[i].id)continue;st-codecpar-codec_id fmt_id_type[i].id;st-codecpar-codec_type fmt_id_type[i].type;sti-need_context_update 1;return score;}}}return 0; } 然后在set_codec_from_probe_data函数外部通过avcodec_parameters_to_context函数将AVCodecParameters的codec_id赋值给AVCodecContext的codec_id int avcodec_parameters_to_context(AVCodecContext *codec,const AVCodecParameters *par) { //...codec-codec_id par-codec_id; //... } 然后在dump_stream_format函数中通过avcodec_string函数中的语句codec_name avcodec_get_name(enc-codec_id) 拿到AVCodecContext的codec_id对应的视频压缩编码格式名称。最后再在dump_stream_format函数中将视频压缩编码格式打印出来 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { //...codec_name avcodec_get_name(enc-codec_id); //... } 所以FFmpeg获取PS文件/PS流的视频压缩编码格式是从PES packet的有效载荷即ES流数据中获取的 三、视频压缩编码格式的profile 如果PS文件/PS流中的视频压缩编码格式为H.264FFmpeg获取其视频压缩编码格式的profile是通过SPS的profile_idc属性获取到的具体可以参考《音视频入门基础H.264专题17——FFmpeg源码中获取H.264视频的profile的实现》 四、视频的色彩格式 如果PS文件/PS流中的视频压缩编码格式为H.264FFmpeg获取其视频的色彩格式是通过SPS中的属性chroma_format_idc获取到的具体可以参考《音视频入门基础H.264专题13——FFmpeg源码中通过SPS属性获取视频色彩格式的实现》 五、视频分辨率 如果PS文件/PS流中的视频压缩编码格式为H.264FFmpeg获取其视频分辨率是通过SPS中的属性获取的具体可以参考《音视频入门基础H.264专题12——FFmpeg源码中通过SPS属性计算视频分辨率的实现》 六、视频码率 由于PS文件/PS流的文件格式包括TS Header、PES packet header不包含视频码率信息所以无法通过FFmpeg直接获取到其视频码率。与之对应由于FLV文件的Script Tag中包含视频码率信息所以FFmpeg可以直接打印FLV文件的视频码率具体可以参考《音视频入门基础FLV专题24——FFmpeg源码中获取FLV文件视频信息的实现》。 七、视频帧率 如果TS文件/TS流中的视频压缩编码格式为H.264对其视频进行编解码时FFmpeg源码内部使用的是通过SPS中的属性计算得到的视频帧率具体可以参考《音视频入门基础H.264专题15——FFmpeg源码中通过SPS属性获取视频帧率的实现》。
http://www.w-s-a.com/news/527867/

相关文章:

  • 网站的风格对比信息表广告门
  • 教育网站建设毕业设计说明书门户网站模式
  • 洛阳霞光建设网站html做分模块的网站
  • 域名建议网站wordpress 伪静态html
  • 网站风格化设计方案免费模式营销案例
  • 凤翔网站建设农村建设自己的网站首页
  • 怎样用网站做单笔外贸建筑设计公司合作加盟
  • 建网站买的是什么网站开发三层结构
  • wordpress图纸管理网站2345网址导航智能主版
  • 想调用等三方网站数据该怎么做培训课程
  • 高端营销网站建设wordpress咨询
  • 网站搜索框如何做创业怎么做网站
  • 网站手机版管理链接产品推广找哪家公司
  • vuejs 可做网站吗蜘蛛互联网站建设
  • 沈阳网站备案查询17zwd一起做业网站
  • 石家庄大型公司建站广州设计网站培训学校
  • 如何让百度收录中文域名网站wordpress前台管理评论
  • 铁岭 建筑公司网站 中企动力建设佛山app开发公司
  • 网站开发用的电脑深圳专业网站建设服务
  • 内容营销价值wordpress博客优化插件
  • 最优惠的郑州网站建设淘宝网商城
  • 做封面网站企业网站优化服务商
  • 电子商务网站设计是什么蚌埠铁路建设监理公司网站
  • .name后缀的网站做房产网站多少钱
  • 手机上传网站源码网站app封装怎么做
  • 做的网站放在阿里云网站建设投标书范本
  • 做文化传播公司网站wordpress仿简书
  • 什么网站有题目做西宁网站制作哪里好
  • 网站上添加图片的原则优易主机 wordpress
  • 用php做的网站源代码那里有做像美团的网站的