首页 > 编程语言 >音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)

音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)

时间:2024-11-09 10:15:16浏览次数:3  
标签:专题 FFmpeg 音视频 源码 FLV 入门

=================================================================

音视频入门基础:FLV专题系列文章:

音视频入门基础:FLV专题(1)——FLV官方文档下载

音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件

音视频入门基础:FLV专题(3)——FLV header简介

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

音视频入门基础:FLV专题(5)——FFmpeg源码中,判断某文件是否为FLV文件的实现

音视频入门基础:FLV专题(6)——FFmpeg源码中,解码FLV header的实现

音视频入门基础:FLV专题(7)——Tag header简介

音视频入门基础:FLV专题(8)——FFmpeg源码中,解码Tag header的实现

音视频入门基础:FLV专题(9)——Script Tag简介

音视频入门基础:FLV专题(10)——Script Tag实例分析

音视频入门基础:FLV专题(11)——FFmpeg源码中,解析SCRIPTDATASTRING类型的ScriptDataValue的实现

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现

音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现

音视频入门基础:FLV专题(15)——Video Tag简介

音视频入门基础:FLV专题(16)——FFmpeg源码中,解码Video Tag的VideoTagHeader的实现

音视频入门基础:FLV专题(17)——FFmpeg源码中,提取Video Tag的VIDEODATA的实现

音视频入门基础:FLV专题(18)——Audio Tag简介

音视频入门基础:FLV专题(19)——FFmpeg源码中,解码Audio Tag的AudioTagHeader,并提取AUDIODATA的实现

音视频入门基础:FLV专题(20)——FFmpeg源码中,获取FLV文件major_brand、minor_version、compatible_brands、encoder、Duration的实现

音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)

音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)

音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)

音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现

音视频入门基础:FLV专题(25)——通过FFprobe显示FLV文件每个packet的信息

=================================================================

本文接着《音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)》,继续讲解FFmpeg获取FLV文件的音频信息到底是从哪个地方获取的。本文的一级标题从“七”开始。

七、Bit depth

FLV文件中每个Audio Tag的AudioTagHeader的SoundSize属性都包含Bit depth(又叫位深度、位元深度、采样深度、采样位数、采样格式)信息。但是如果FLV文件中的音频压缩编码格式为AAC,FFmpeg会强制把Bit depth设置为fltp。这是因为对于有损压缩编解码器(如MP3和AAC),Bit depth是在编码期间计算的,并且可以因采样而异,Bit depth只对PCM数字信号有意义。具体可以参考:《音视频入门基础:AAC专题(3)——AAC的ADTS格式简介》。

可以看到在aac_decode_init函数中(该函数定义在libavcodec/aacdec_template.c),强制把音频采样格式设置成了AV_SAMPLE_FMT_FLTP:

static av_cold int aac_decode_init(AVCodecContext *avctx)
{
//...
    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
//...
}

所以如果FLV文件中的音频压缩编码格式为AAC,通过“ffmpeg -i video1.flv命令”获取到的音频采样格式固定为fltp,该值没有意义:

八、音频码率

FFmpeg获取音频码率是通过解析名称为“onMetadata”的Script Tag获取的。onMetadata中存在一个audiodatarate属性表示音频码率,单位为kilobits per second,即Kbps:

由《音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现》、《音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现》可以知道,FFmpeg源码通过amf_parse_object函数中的下面代码块将名称为“onMetadata”的Script Tag中audiodatarate属性解析出来,乘以1024,得到单位为bps的音频码率,存到flv->audio_bit_rate中,即存到(FLVContext *)(s->priv_data)->audio_bit_rate中:

static int amf_parse_object(AVFormatContext *s, AVStream *astream,
                            AVStream *vstream, const char *key,
                            int64_t max_pos, int depth)
{
//...
    if (key) {
    //...
        if (depth == 1) {
            if (amf_type == AMF_DATA_TYPE_NUMBER ||
                amf_type == AMF_DATA_TYPE_BOOL) {
                //...
                else if (!strcmp(key, "audiodatarate") &&
                         0 <= (int)(num_val * 1024.0))
                    flv->audio_bit_rate = num_val * 1024.0;
                //...
                }
        //...
        }
    }
}

然后通过libavformat/flvdec.c中的create_stream函数,将flv->audio_bit_rate赋值给AVCodecParameters的bit_rate。st->codecpar为指向一个AVCodecParameters类型变量的指针:

static AVStream *create_stream(AVFormatContext *s, int codec_type)
{
//...
    if (codec_type == AVMEDIA_TYPE_AUDIO) {
        st->codecpar->bit_rate = flv->audio_bit_rate;
        flv->missing_streams &= ~FLV_HEADER_FLAG_HASAUDIO;
    }
//...
}

通过avcodec_parameters_to_context函数将AVCodecParameters的bit_rate赋值给AVCodecContext的bit_rate:

int avcodec_parameters_to_context(AVCodecContext *codec,
                                  const AVCodecParameters *par)
{
//...
    codec->bit_rate              = par->bit_rate;
//...
}

然后在dump_stream_format函数中,通过avcodec_string函数中的语句:bitrate = get_bit_rate(enc)拿到AVCodecContext的bit_rate,该bit_rate以bps为单位。最后再把它除以1000,得到以kb/s为单位的音频码率,打印出来:

void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
{
//...
    bitrate = get_bit_rate(enc);
    if (bitrate != 0) {
        av_bprintf(&bprint, ", %"PRId64" kb/s", bitrate / 1000);
//...
}

所以通过flvAnalyser工具查看到的音频码率跟使用FFmpeg命令查看到的音频码率不一样,这是因为FFmpeg源码中获取onMetadata中的audiodatarate属性是先把它乘以1024,但是打印的时候再除以1000的(正常情况下打印的时候应该除以1024才对)。比如实际的音频码率为133.6865kb/s,乘以1024就是136895b/s,再除以1000就变成了136kb/s。所以FFmpeg(截止FFmpeg7.0.1)打印音频码率这部分代码应该是有bug的,导致显示的音频码率不准确:

标签:专题,FFmpeg,音视频,源码,FLV,入门
From: https://blog.csdn.net/u014552102/article/details/143447307

相关文章

  • 使用ffmpeg命令处理音视频
    FFmpeg可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec(用于多个项目中音频和视频的解码器库)和libavformat(音频与视频格式转换库)。(关于一些底层方面的东西,可以参考ffmpeg和H264视频的编解码) https://www.octfgroup.com/1,获得一个文件的音视频(编码方面的)信息:ge......
  • 【含文档+PPT+源码】基于JavaWeb的高校迎新系统系统
    项目背景与意义随着高校招生规模的不断扩大和信息化建设的深入,大学生迎新报到工作面临着越来越多的挑战。传统的迎新报到方式,如学生排队等待、填写纸质表格等,不仅效率低下,容易出错,还给学生和学校带来了诸多不便。特别是在新生入学的高峰期,传统的迎新流程往往会导致报到现场人......
  • 【含文档+PPT+源码】基于SpringBoot的校园跑腿管理系统
    项目背景与意义随着电子商务和在线购物的普及,校园内的快递量急剧增加。学生们因为课程繁忙或其他个人原因,往往无法及时领取快递,导致快递堆积、丢失或延误等问题频发。这不仅影响了学生的日常生活,也给快递员带来了较大的工作压力,降低了校园内的物流效率。其次,现有的校园快递收......
  • ffmpeg处理音视频
    FFmpeg怎么念FFmpeg念作efefempeg,其全称为FastForwardMovingPictureExpertGroupFFmpeg是什么FFmpeg是一套领先的多媒体框架,是一套开源且跨平台的多媒体解决方案,提供了音视频的编码、解码、转码、封装、解封装、流媒体、滤镜、播放等功能,官网地址为ffmpeg.orgFFmpeg可......
  • 短视频平台源码,聊一聊线程池的预热
    短视频平台源码,聊一聊线程池的预热序本文主要研究一下线程池的预热prestartCoreThreadjava/util/concurrent/ThreadPoolExecutor.java /***Startsacorethread,causingittoidlywaitforwork.This*overridesthedefaultpolicyofst......
  • 【开题报告】基于Springboot+vue牧场信息化系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着科技的飞速发展和信息化时代的到来,传统牧场管理模式正面临前所未有的挑战与机遇。传统牧场往往依赖人工记录与监控,这种方式不仅效率低下,而且容易......
  • 【开题报告】基于Springboot+vue停车场管理系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,车辆数量急剧增加,停车难已成为各大城市普遍面临的问题。传统的停车场管理方式存在诸多不足,如车位利用率低、停车体验差、管理效......
  • springboot线上教育及评价系统-计算机设计毕业源码08666
    springboot线上教育及评价系统摘要本文介绍了一个基于SpringBoot的线上教育及评价系统。该系统旨在提供一个便捷、高效的在线教育平台,同时结合学生评价功能,为教育机构和学生提供全面的教育资源和评价反馈。通过使用SpringBoot框架和相关技术,我们设计和实现了一个用户友好......
  • 【开题报告】基于Springboot+vue校园畅聊交友平台的设计与实现(程序+源码+论文) 计算机
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和智能设备的普及,大学生们的社交方式正经历着深刻的变革。传统的面对面交流虽然仍然重要,但线上社交平台以其便捷性和高效性,逐......
  • 基于微信小程序的婚庆摄影系统设计与实现(源码+论文+部署讲解等)
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......