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

什么网站发布找做效果图的手机电脑网站一站式

什么网站发布找做效果图的,手机电脑网站一站式,广州番禺区人才网,seo网站推广工作内容本文接着《音视频入门基础#xff1a;FLV专题#xff08;21#xff09;——FFmpeg源码中#xff0c;获取FLV文件音频信息的实现#xff08;上#xff09;》#xff0c;继续讲解FFmpeg获取FLV文件的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四、音…本文接着《音视频入门基础FLV专题21——FFmpeg源码中获取FLV文件音频信息的实现上》继续讲解FFmpeg获取FLV文件的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四、音频采样率 一FFmpeg源码中获取FLV文件音频采样率的实现 FLV文件中名称为“onMetadata”的Script Tag、每个Audio Tag的AudioTagHeader、AudioSpecificConfig都包含音频采样率信息。但是FFmpeg获取FLV文件的音频采样率是从AudioSpecificConfig的samplingFrequencyIndex属性中获取的、而忽略另外两个地方的音频采样率信息。 由《音视频入门基础AAC专题11——AudioSpecificConfig简介》可以知道FLV文件中的音频为AAC时正常情况下它必定存在一个Audio Tag包含Audio Specific Config而Audio Specific Config中存在一个占4位的samplingFrequencyIndex属性表示音频的采样频率 由《音视频入门基础AAC专题12——FFmpeg源码中解码AudioSpecificConfig的实现》可以知道ff_mpeg4audio_get_config_gb函数中通过语句c-sample_rate get_sample_rate(gb, c-sampling_index)获取AudioSpecificConfig的samplingFrequencyIndex属性。执行decode_audio_specific_config_gb函数后m4ac指向的变量会得到从AudioSpecificConfig中解码出来的属性 static inline int get_sample_rate(GetBitContext *gb, int *index) {*index get_bits(gb, 4);return *index 0x0f ? get_bits(gb, 24) :ff_mpeg4audio_sample_rates[*index]; } 然后在decode_audio_specific_config_gb函数外部通过aac_decode_frame_int函数将上一步得到的samplingFrequencyIndex属性赋值给AVCodecContext的sample_rate static int aac_decode_frame_int(AVCodecContext *avctx, AVFrame *frame,int *got_frame_ptr, GetBitContext *gb,const AVPacket *avpkt) { //...if (ac-oc[1].status audio_found) {avctx-sample_rate ac-oc[1].m4ac.sample_rate multiplier;avctx-frame_size samples;ac-oc[1].status OC_LOCKED;} //... } 然后在dump_stream_format函数中通过avcodec_string函数中的语句av_bprintf(bprint, %d Hz, , enc-sample_rate)拿到上一步中得到的AVCodecContext的sample_rate。最后再在dump_stream_format函数中将profile打印出来 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { //...switch (enc-codec_type) {case AVMEDIA_TYPE_AUDIO:av_bprintf(bprint, %s, separator);if (enc-sample_rate) {av_bprintf(bprint, %d Hz, , enc-sample_rate);} //...} //... } 二修改Audio Specific Config中的samplingFrequencyIndex属性验证 下面我们做一个验证 FLV文件video1.flv的Audio Specific Config中的samplingFrequencyIndex属性的值为4对应的音频采样频率为44100Hz 用ffmpeg -i video1.flv命令可以查看到video1.flv文件的音频采样频率为44100Hz 我们用Notepad修改video1.flv文件的Audio Specific Config中的samplingFrequencyIndex属性把它的值从4改为0。修改完成后把文件名称改为“video1_AudioSpecificConfig.flv” 用flvAnalyser工具打开修改后的FLV文件video1_AudioSpecificConfig.flv可以看到Audio Specific Config中的samplingFrequencyIndex属性的值确实被修改为了0对应音频采样频率变为了96000Hz 用“ffmpeg -i video1_AudioSpecificConfig.flv”命令可以查看到FLV文件的音频采样频率确实变为96000Hz了 用ffplay播放video1_AudioSpecificConfig.flv会发现没有声音从而证明FFmpeg获取FLV文件的音频采样率是从AudioSpecificConfig的samplingFrequencyIndex属性中获取的。由于video1_AudioSpecificConfig.flv文件的samplingFrequencyIndex属性被修改了 所以它的音频采样频率信息不正确导致用ffplay播放不出来 但是要注意的是每种音视频SDK和音视频播放器获取音频采样率的位置都不同比如FFmpeg是从AudioSpecificConfig的samplingFrequencyIndex属性中获取的但是VLC是从Audio Tag的AudioTagHeader中获取的。 用VLC播放video1_AudioSpecificConfig.flv会发现其显示的音频采样频率还是修改前的44100Hz可以正常播放声音。因为VLC获取FLV文件的音频采样频率是从Audio Tag的AudioTagHeader中获取 五、音频声道数 一FFmpeg源码中获取FLV文件音频声道数的实现 FLV文件中名称为“onMetadata”的Script Tag、每个Audio Tag的AudioTagHeader、AudioSpecificConfig都包含音频声道数信息。FFmpeg获取FLV文件的音频声道数主要是从Audio Tag的AudioTagHeader中的SoundType属性获取的。 由《音视频入门基础FLV专题18——Audio Tag简介》可以知道Audio Tag的AudioTagHeader中存在一个占1位的SoundType属性表示音频声道数 0单声道 1立体声 由《音视频入门基础FLV专题19——FFmpeg源码中解码Audio Tag的AudioTagHeader并提取AUDIODATA的实现》可以知道FFmpeg源码中使用flv_read_packet函数来读取每个Tag的信息。如果判断出该Tag为Audio Tagflv_read_packet函数中会通过下面代码块将AudioTagHeader的SoundType属性提取出来转换得到音频音频声道数。将音频声道数目存贮到局部变量channels中 channels (flags FLV_AUDIO_CHANNEL_MASK) FLV_STEREO ? 2 : 1; 将上述得到的音频声道数目赋值给st-codecpar-ch_layout。st-codecpar为指向一个AVCodecParameters类型变量的指针 if (!av_channel_layout_check(st-codecpar-ch_layout) ||!st-codecpar-sample_rate ||!st-codecpar-bits_per_coded_sample) {av_channel_layout_default(st-codecpar-ch_layout, channels);//...} 然后在flv_read_packet函数外部通过avcodec_parameters_to_context函数将AVCodecParameters的ch_layout赋值给AVCodecContext的ch_layout int avcodec_parameters_to_context(AVCodecContext *codec,const AVCodecParameters *par) { //...switch (par-codec_type) {case AVMEDIA_TYPE_AUDIO:ret av_channel_layout_copy(codec-ch_layout, par-ch_layout);//....break;} //... } 然后在dump_stream_format函数中通过avcodec_string函数中的语句:av_channel_layout_describe_bprint(enc-ch_layout, bprint)拿到AVCodecContext的ch_layout对应的音频声道数目。最后再在dump_stream_format函数中将音频声道数目打印出来 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) { //...switch (enc-codec_type) {case AVMEDIA_TYPE_AUDIO:av_channel_layout_describe_bprint(enc-ch_layout, bprint);//...break;} //... } 二修改Audio Specific Config中的channelConfiguration属性验证 下面我们做一个验证 FLV文件video1.flv的Audio Tag的AudioTagHeader中的SoundType属性值为1对应的音频声道数为立体声双声道。这里由于flvAnalyser工具的局限性没办法直接看到AudioTagHeader中的SoundType属性但是按照《音视频入门基础FLV专题18——Audio Tag简介》中讲述的格式自己换算一下SoundType的值就出来了。0xAF等于二进制的0b10101111SoundFormat占4位SoundRate占2位SoundSize占1位所以这里SoundType的值就是1 该文件的Audio Specific Config中的channelConfiguration属性的值为2对应的音频声道数也为双声道 用ffmpeg -i video1.flv命令可以查看到video1.flv文件的音频声道数为双声道 我们用Notepad修改video1.flv文件的Audio Specific Config中的channelConfiguration属性把它的值从2改为1。修改完成后把文件名称改为“video1_AudioSpecificConfig1.flv”。用flvAnalyser工具打开修改后的FLV文件video1_AudioSpecificConfig1.flv可以看到Audio Specific Config中的channelConfiguration属性的值确实被修改为了1对应音频声道数为单声道 但是用“ffmpeg -i video1_AudioSpecificConfig1.flv”命令查看到FLV文件发现其音频声道数还是为双声道。因为FFmpeg获取FLV文件的音频声道数主要是从Audio Tag的AudioTagHeader中的SoundType属性获取所以修改Audio Specific Config中的channelConfiguration属性对音频声道数没有影响 但是这并不意味着对FFmpeg源码来讲Audio Specific Config中的channelConfiguration属性没有意义相反FFmpeg同样会参考channelConfiguration属性。比如把Audio Specific Config中的channelConfiguration属性修改为4重新使用“ffmpeg -i video1_AudioSpecificConfig1.flv”命令会发现报错“channel element 1.0 is not allocated” 把Audio Specific Config中的channelConfiguration属性修改为0重新使用“ffmpeg -i video1_AudioSpecificConfig1.flv”命令会发现报错“ Could not find codec parameters for stream 1 (Audio: aac, 44100 Hz, 0 channels, fltp, 136 kb/s): unspecified number of channels ” 所以FFmpeg获取FLV文件的音频声道数主要是从Audio Tag的AudioTagHeader中的SoundType属性获取但是它也会参考Audio Specific Config中的channelConfiguration属性。 六、FFmpeg获取FLV文件音频采样率和音频声道数总结 从上面我们可以知道FLV文件中名称为“onMetadata”的Script Tag、每个Audio Tag的AudioTagHeader、AudioSpecificConfig都会包含音频信息每种音视频SDK或者音视频播放器获取音频信息时获取的位置和策略可能都不一样。所以很多时候我们播放FLV文件音频的时候会发现用ffplay能播但用vlc无法播放或者反过来用vlc能播但是用ffplay无法播放。当FLV文件中某些地方的音频信息不正确但是其它地方音频信息正确时就会发生某些播放器能正常播放其它播放器无法播放的情况。所以一定要搞清楚我们使用的音视频SDK和播放器到底获取的是哪个位置的音频信息。
http://www.w-s-a.com/news/535179/

相关文章:

  • 浦口区网站建设售后服务建设一个网站多少钱
  • 做个小网站大概多少钱广州h5网站
  • 360免费建站视频wordpress标签显示图片
  • 创建简易个人网站国外做网站被动收入
  • 轻定制网站建设网页培训哪个机构好
  • 青岛海诚互联做网站好吗计算机软件开发培训机构
  • 德钦网站建设如何在网站上做用工登记
  • 创意品牌网站云服务
  • 个人备案网站可以做商城展示如何制作网页二维码
  • 网站建设php教程视频百度seo 站长工具
  • 外包小程序两个相同的网站对做优化有帮助
  • 网站备案主体修改wordpress 导航图片
  • 怎么建设网站数据库用vs代码做网站
  • 运营企业网站怎么赚钱动漫制作专业概念
  • 宜春网站建设推广网络推广工作好干吗
  • 网站程序0day平顶山市做网站
  • 企业网站名称怎么写哔哩哔哩网页版官网在线观看
  • 直播网站建设书籍阿里巴巴网站建设销售
  • 肇庆企业自助建站系统郴州网站建设解决方案
  • 长沙专业做网站排名游戏开发大亨内购破解版
  • 网站推广适合女生做吗网站如何开启gzip压缩
  • 做外单阿里的网站建站平台那个好
  • 全国性质的网站开发公司关于网站开发的请示
  • 齐齐哈尔住房和城乡建设局网站生物科技公司网站模板
  • 中国建设协会官方网站前端培训的机构
  • 网站建设套餐是什么北京孤儿院做义工网站
  • 网站如何做微信支付链接做暧小视频xo免费网站
  • SEO案例网站建设重庆建站模板平台
  • 上海seo网站推广公司wordpress 小米商城主题
  • 搭建服务器做网站什么网站可以请人做软件