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

做那个网站大全3网站建设

做那个网站大全,3网站建设,营销策划培训,网页设计实训报告3篇对于一个视频文件(mp4格式/flv格式),audio_pkt或者video_pkt是其最基本的数据单元,即视频文件是由独立的视频编码包或者音频编码包组成的。 解复用就是从视频文件中把视频包/音频包单独读取出来保存成独立文件,那么如何得知packet是视频包还是…

对于一个视频文件(mp4格式/flv格式),audio_pkt或者video_pkt是其最基本的数据单元,即视频文件是由独立的视频编码包或者音频编码包组成的。
解复用就是从视频文件中把视频包/音频包单独读取出来保存成独立文件,那么如何得知packet是视频包还是音频包呢?有这样一个结构体:

typedef struct AVPacket {AVBufferRef *buf;      // 指向数据缓冲区的指针int64_t pts;           // 显示时间戳int64_t dts;           // 解码时间戳uint8_t *data;         // 指向数据缓冲区的指针int size;              // 数据缓冲区大小int stream_index;      // 数据包所属的流标签int flags;             // 数据包的标志位AVPacketSideData *side_data; // 侧数据数组int side_data_elems;   // 侧数据数组的元素数量int64_t duration;      // 数据包的持续时间int64_t pos;           // 数据包在输入文件中的位置int64_t convergence_duration; // 数据包的收敛持续时间(弃用)
} AVPacket;

AVPacket中的stream_index标记了该包是属于音频流还是视频流,stream_index对应什么值的时候是属于音频流/视频流呢?那就需要解析flv/mp4文件,我们可以通过以下方式获得视频流的相关信息:

	char* in_filename = "/home/yx/media_file/believe.flv";	// 定义媒体流路径AVFormatContext *in_file_ctx = NULL;    // 媒体流上下文int videoindex = -1;                    // 视频索引int audioindex = -1;                    // 音频索引int result = avformat_open_input(&in_file_ctx,in_filename,NULL,NULL);   // 打开媒体流(将输入文件与媒体流相关)result = avformat_find_stream_info(in_file_ctx,NULL);                   // 查找媒体流信息printf("stream number:%d\n",in_file_ctx->nb_streams);                   // 打印媒体流中流种类个数,一般只有两个:音频/视频for(uint32_t i = 0;i < in_file_ctx->nb_streams; i++)                    // 遍历两个流{AVStream* in_stream = in_file_ctx->streams[i];                      // 指定视频流文件中第i个流if(in_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){printf("**********音频流**********\n");printf("samplerate:%dHz\n",in_stream->codecpar->sample_rate);   // 采样率printf("index:%d\n",in_stream->index);                          // 媒体流标签printf("channel number:%d\n",in_stream->codecpar->channels);    // 声道数if(in_stream->codecpar->format == AV_SAMPLE_FMT_FLTP)           // 采样格式printf("sampleformat:AV_SAMPLE_FMT_FLTP\n");else if(in_stream->codecpar->format == AV_SAMPLE_FMT_S16P)printf("sampleformat:AV_SAMPLE_FMT_S16P\n");if(in_stream->codecpar->codec_id == AV_CODEC_ID_AAC)            // 打印音频流编码格式printf("audio codec:AV_CODEC_ID_AAC\n");else if(in_stream->codecpar->codec_id == AV_CODEC_ID_MP3)printf("audio codec:AV_CODEC_ID_MP3\n");elseprintf("audio codec:%d\n",in_stream->codecpar->codec_id);if(in_stream->duration != AV_NOPTS_VALUE){int duration_audio = (in_stream->duration)*av_q2d(in_stream->time_base);printf("audio duration: %02d:%02d:%02d\n",duration_audio/3600,(duration_audio % 3600)/60,(duration_audio % 60));}elseprintf("audio duration unknown\n");audioindex = i;                                                 // 获得音频标签													}else if(in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){printf("**********视频流**********\n");printf("fps:%lffps\n",av_q2d(in_stream->avg_frame_rate));       // 帧率printf("index:%d\n",in_stream->index);                          // 媒体流标签printf("width:%d,height:%d\n",in_stream->codecpar->width,in_stream->codecpar->height);    // 声道数if(in_stream->codecpar->codec_id = AV_CODEC_ID_MPEG4)printf("video codec:MPEG4\n");else if(in_stream->codecpar->codec_id = AV_CODEC_ID_H264)printf("video codec:H264\n");elseprintf("video codec:%d\n",in_stream->codecpar->codec_id);if(in_stream->duration != AV_NOPTS_VALUE){int duration_audio = (in_stream->duration)*av_q2d(in_stream->time_base);printf("video duration: %02d:%02d:%02d\n",duration_audio/3600,(duration_audio % 3600)/60,(duration_audio % 60));}elseprintf("video duration unknown\n");videoindex = i;                                                 // 获得视频标签}}

此时我们就获得了解复用最关键的信息:视频流标签和音频流标签,接下来只需要依次读取视频流中的packet,依次判断AVPacket中的stream_index来区分音频或者视频,这里先读取20个packet进行分析:

AVPacket* pkt = av_packet_alloc();int pkt_count = 0;                                  // 当前是第0个包int print_count = 20;                               // 最大打印十个包的信息while(pkt_count<=20)                                // 只解析20个包{result = av_read_frame(in_file_ctx,pkt);        // 依次从输入视频来读取包if(result < 0){printf("av_read_frame fail\n");break;}if(pkt_count++ < print_count){if(pkt->stream_index == audioindex){printf("audioindex:%d\n",audioindex);printf("audio pts: %lld\n", pkt->pts);printf("audio dts: %lld\n", pkt->dts);printf("audio size: %d\n", pkt->size);printf("audio pos: %lld\n", pkt->pos);printf("audio duration: %lf\n\n",pkt->duration * av_q2d(in_file_ctx->streams[audioindex]->time_base));}else if(pkt->stream_index == videoindex){printf("videoindex:%d\n",videoindex);printf("video pts: %lld\n", pkt->pts);printf("video dts: %lld\n", pkt->dts);printf("video size: %d\n", pkt->size);printf("video pos: %lld\n", pkt->pos);printf("video duration: %lf\n\n",pkt->duration * av_q2d(in_file_ctx->streams[videoindex]->time_base));}}av_packet_unref(pkt);                           // 解析完引用计数-1,自动释放}

这里我们读取到视频包或者音频包后,打印包的详细信息:
pts:编码时间戳,dts:解码时间戳,size:包的大小,pos:包当前的位置。
每一个包的相关信息读取之后,调用 av_packet_unref(pkt)使引用计数–,当计数减为0,系统会自动释放该部分空间。
在这里插入图片描述

完整代码如下:

#include <stdio.h>
#include "libavformat/avformat.h"
void demux_flv()
{char* in_filename = "/home/yx/media_file/believe.flv";printf("输入文件路径%s\n",in_filename);AVFormatContext *in_file_ctx = NULL;    // 媒体流上下文int videoindex = -1;                    // 视频索引int audioindex = -1;                    // 音频索引int result = avformat_open_input(&in_file_ctx,in_filename,NULL,NULL);   // 打开媒体流(将输入文件与媒体流相关)if(result < 0)printf("open file fail\n");result = avformat_find_stream_info(in_file_ctx,NULL);                   // 查找媒体流信息if(result < 0)printf("find stream info fail\n");av_dump_format(in_file_ctx,0,in_filename,0);                            // 打印输出媒体流的信息,第1个0表示输出所有流printf("media name:%s\n",in_file_ctx->url);printf("stream number:%d\n",in_file_ctx->nb_streams);                   // 只有两个流:视频流或者音频流printf("media average radio:%lldkps\n",(int64_t)(in_file_ctx->bit_rate/1024));int total_seconds,hour,minute,second;total_seconds = (in_file_ctx->duration)/AV_TIME_BASE;hour = total_seconds/3600;minute = (total_seconds % 3600)/60;second = (total_seconds % 60);printf("total duration: %02d:%02d:%02d\n",hour,minute,second);for(uint32_t i = 0;i < in_file_ctx->nb_streams; i++)                    // 遍历两个流{AVStream* in_stream = in_file_ctx->streams[i];                      // 指定视频流文件中第i个流if(in_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){printf("**********音频流**********\n");printf("samplerate:%dHz\n",in_stream->codecpar->sample_rate);   // 采样率printf("index:%d\n",in_stream->index);                          // 媒体流标签printf("channel number:%d\n",in_stream->codecpar->channels);    // 声道数if(in_stream->codecpar->format == AV_SAMPLE_FMT_FLTP)           // 采样格式printf("sampleformat:AV_SAMPLE_FMT_FLTP\n");else if(in_stream->codecpar->format == AV_SAMPLE_FMT_S16P)printf("sampleformat:AV_SAMPLE_FMT_S16P\n");if(in_stream->codecpar->codec_id == AV_CODEC_ID_AAC)            // 打印音频流编码格式printf("audio codec:AV_CODEC_ID_AAC\n");else if(in_stream->codecpar->codec_id == AV_CODEC_ID_MP3)printf("audio codec:AV_CODEC_ID_MP3\n");elseprintf("audio codec:%d\n",in_stream->codecpar->codec_id);if(in_stream->duration != AV_NOPTS_VALUE){int duration_audio = (in_stream->duration)*av_q2d(in_stream->time_base);printf("audio duration: %02d:%02d:%02d\n",duration_audio/3600,(duration_audio % 3600)/60,(duration_audio % 60));}elseprintf("audio duration unknown\n");audioindex = i;                                                 // 获得音频标签}else if(in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){printf("**********视频流**********\n");printf("fps:%lffps\n",av_q2d(in_stream->avg_frame_rate));       // 帧率printf("index:%d\n",in_stream->index);                          // 媒体流标签printf("width:%d,height:%d\n",in_stream->codecpar->width,in_stream->codecpar->height);    // 声道数if(in_stream->codecpar->codec_id = AV_CODEC_ID_MPEG4)printf("video codec:MPEG4\n");else if(in_stream->codecpar->codec_id = AV_CODEC_ID_H264)printf("video codec:H264\n");elseprintf("video codec:%d\n",in_stream->codecpar->codec_id);if(in_stream->duration != AV_NOPTS_VALUE){int duration_audio = (in_stream->duration)*av_q2d(in_stream->time_base);printf("video duration: %02d:%02d:%02d\n",duration_audio/3600,(duration_audio % 3600)/60,(duration_audio % 60));}elseprintf("video duration unknown\n");videoindex = i;                                                 // 获得视频标签}}printf("====================================\n");AVPacket* pkt = av_packet_alloc();int pkt_count = 0;                                  // 当前是第0个包int print_count = 20;                               // 最大打印十个包的信息while(pkt_count<=20)                                // 只解析20个包{result = av_read_frame(in_file_ctx,pkt);        // 依次从输入视频来读取包if(result < 0){printf("av_read_frame fail\n");break;}if(pkt_count++ < print_count){if(pkt->stream_index == audioindex){printf("audioindex:%d\n",audioindex);printf("audio pts: %lld\n", pkt->pts);printf("audio dts: %lld\n", pkt->dts);printf("audio size: %d\n", pkt->size);printf("audio pos: %lld\n", pkt->pos);printf("audio duration: %lf\n\n",pkt->duration * av_q2d(in_file_ctx->streams[audioindex]->time_base));}else if(pkt->stream_index == videoindex){printf("videoindex:%d\n",videoindex);printf("video pts: %lld\n", pkt->pts);printf("video dts: %lld\n", pkt->dts);printf("video size: %d\n", pkt->size);printf("video pos: %lld\n", pkt->pos);printf("video duration: %lf\n\n",pkt->duration * av_q2d(in_file_ctx->streams[videoindex]->time_base));}}av_packet_unref(pkt);                           // 解析完引用计数-1,自动释放}
}int main()
{demux_flv();printf("Hello World!\n");return 0;
}
http://www.sczhlp.com/news/140413/

相关文章:

  • 做运营常用的网站专业网络推广机构
  • 化妆品行业网站建设程序员源码网站
  • wordpress网站防护儿童网站建设
  • 重庆潼南网站建设哪家便宜网站开发设计选题背景
  • 能通过付费网站看别人空间吗搭建公众号平台需要多少钱
  • 专门做app的网站四川省省建设厅网站
  • 莆田市网站建设wordpress上传突然提示需要ftp
  • 浙江网站建设而专业团队建设方案
  • C#如何做简易网站公司网站建设合同要交印花税吗
  • 苏州企业网站推广临沂做网站建设的公司
  • 天乐测绘网做网站吗萝岗电子商务网站建设
  • 商业网站设计方案模板哪个网站有建设需要等文件
  • 建旅游网站的意义整站seo排名费用价格
  • 兰州网站建设推荐q479185700上墙建设网站的群
  • 深圳网站建设公司盛世华彩自助建站是什么意思
  • wordpress 首页显示摘要域名网站做优化外链
  • 象山专业网站建设软件技术毕业设计
  • 七星彩的网站怎么做的免费空间领取网站
  • 做网站获取手机号码自助健站
  • 昔阳网站建设江苏省建设工程地方标准网站
  • 江苏盐城网站建设西安网站建设最新案例
  • 兰溪好品质高端网站设计大连高新区规划建设局网站
  • 经营网站icp备案要求做心悦腾龙光环的网站是什么
  • 电子商务网站建设的相关流程北京做网站费用
  • 阳泉推广型网站建设室内设计学徒有多坑
  • 建湖做网站的微信做网站的弊端
  • 移动网站建设书籍推荐宜宾建设网
  • 马鞍山网站建设制作长春网站建设 找源晟
  • 百度显示网站正在建设中投资网站源码
  • 万网域名注册网站免费的黄台app下载