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

合肥网站空间wordpress 鼠标移动到标题会显示图片

合肥网站空间,wordpress 鼠标移动到标题会显示图片,无锡有没有做网站的公司,东莞网站设计价格本文接着《音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)》,继续讲解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 Tag,flv_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等于二进制的0b10101111,SoundFormat占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.yayakq.cn/news/594242/

相关文章:

  • 建一个网站需要多久怎么弄自己的网址
  • 像优酷这样的网站需要怎么做网站怎么让百度收录一张图做封面
  • wordpress怎么做网盘站免费建站公司联系方式
  • 网站开发项目经验大学网页设计课程
  • 安徽索凯特建设工程有限公司网站浏览器正能量网站免费软件
  • 做网站 搜索引擎自助建站门户网站
  • 通过alt让搜索引擎了解该图片信息很多是网站有问题吗一个简单的游戏网站建设
  • 中国建设劳动学会网站企业站网站
  • 建网站需要多少钱和什么条件有关网站建设支付接口
  • vs做网站如何放背景图中国建信网官网
  • 面试学校网站开发设计公司口号
  • 班级网站建设组织机构巩义网站推广怎么做
  • 微擎怎么做网站win7做网站服务器卡
  • 秦皇岛高端网站设计网页设计基础代码网站
  • 合肥专业做网站的公司有哪些家政服务网站建设
  • 网站制作比较好的公司有没有帮别人做网站
  • 网站建设中效果企业网站快照更新
  • 什么是营销型网站建设上海网站关键词排名优化报价
  • 北京手机响应式网站建设设计网站兼容性怎么调
  • 屏山县龙华镇中心村建设招标网站杭州十大互联网公司
  • 网站开发时间段推广营销平台
  • android电影网站开发做得好的营销网站
  • 天津专业的做网站与运营的公司如何做一个公司的网站
  • 网约车后台平台网站建设济南cms建站
  • 网站入股云建站网站开发制作学徒
  • 厦门做百度推广的网站wordpress 禁用版本
  • 网站的特征汇点远程app下载安装
  • 商务网站开发的的基本流程php做网站安装
  • 建设网站最新动态建设企业网站方法
  • 做网站需要自己研发吗明星网页网站制作