ffmpeg库音频解码示例(转载)

ffmpeg解码音频planar模式和packed模式 转载:原文地址: FFmpeg连载4-音频解码-阿里云开发者社区ffmpeg连载系列。 阅读详情
# include   < stdio . h >
#include <stdlib.h>
extern "C"{//
#include "avcodec.h"
#include "avformat.h"
}


int main(char arg,char *argv[])
{
    char *filename ="02.swf";
    
    av_register_all();//注册所有可解码类型
    AVFormatContext *pInFmtCtx=NULL;//文件格式
    AVCodecContext *pInCodecCtx=NULL;//编码格式 
    if (av_open_input_file(&pInFmtCtx,filename,NULL, 0, NULL)!=0)//获取文件格式
        printf("av_open_input_file error\n");
    if(av_find_stream_info(pInFmtCtx) < 0)//获取文件内音视频流的信息
        printf("av_find_stream_info error\n");
    
    unsigned int j;
    // Find the first audio stream

    int    audioStream = -1;
    for(j=0; j<pInFmtCtx->nb_streams; j++)//找到音频对应的stream
        if(pInFmtCtx->streams[j]->codec->codec_type==CODEC_TYPE_AUDIO)
        {
            audioStream=j;
            break;
        }
        if(audioStream==-1)
        {
            printf("input file has no audio stream\n");
            return 0; // Didn't find a audio stream

        }
        printf("audio stream num: %d\n",audioStream);
        pInCodecCtx = pInFmtCtx->streams[audioStream]->codec;//音频的编码上下文
        AVCodec *pInCodec=NULL;
        /* FILE *file3 = fopen("codec_private_data_size.txt","w");
        for(int i = 0; i <200000; i++)
        {
        pInCodec = avcodec_find_decoder((CodecID)i);
        if (pInCodec!=NULL)
        {
        fprintf(file3,"%s %d\n",pInCodec->name,pInCodec->priv_data_size );
        }
        }
        fclose(file3); 
        system("pause");
        */

        pInCodec = avcodec_find_decoder(pInCodecCtx->codec_id);//根据编码ID找到用于解码的结构体
        if(pInCodec==NULL)
        {
            printf("error no Codec found\n");
            return -1 ; // Codec not found
        }


        //使用test的代替pInCodecCtx也可以完成解码,可以看出只要获取以下几个重要信息就可以实现解码和重采样
        AVCodecContext *test = avcodec_alloc_context();
        test->bit_rate = pInCodecCtx->bit_rate;//重采样用
        test->sample_rate = pInCodecCtx->sample_rate;//重采样用
        test->channels = pInCodecCtx->channels;//重采样用
        test->extradata = pInCodecCtx->extradata;//若有则必有
        test->extradata_size = pInCodecCtx->extradata_size;//若有则必要
        test->codec_type = CODEC_TYPE_AUDIO;//不必要
        test->block_align = pInCodecCtx->block_align ;//必要

        
        if(avcodec_open(test, pInCodec)<0)//将两者结合以便在下面的解码函数中调用pInCodec中的对应解码函数
        {
            printf("error avcodec_open failed.\n");
            return -1; // Could not open codec

        }
        
        if(avcodec_open(pInCodecCtx, pInCodec)<0)
        {
            printf("error avcodec_open failed.\n");
            return -1; // Could not open codec

        }
        
        static AVPacket packet;
        
        printf(" bit_rate = %d \r\n", pInCodecCtx->bit_rate);
        printf(" sample_rate = %d \r\n", pInCodecCtx->sample_rate);
        printf(" channels = %d \r\n", pInCodecCtx->channels);
        printf(" code_name = %s \r\n", pInCodecCtx->codec->name);
        //printf("extra data size: %d :data%x %x %x %x\n",pInCodecCtx->extradata_size,pInCodecCtx->extradata[0]
        //     ,pInCodecCtx->extradata[1],pInCodecCtx->extradata[2],pInCodecCtx->extradata[3]);
        printf(" block_align = %d\n",pInCodecCtx->block_align);
        
        //system("pause");
        //////////////////////////////////////////////////////////////////////////

        uint8_t *pktdata;
        int pktsize;
        int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE*100;
        uint8_t * inbuf = (uint8_t *)malloc(out_size);
        FILE* pcm,*packetinfo;
        packetinfo = fopen("packetinfo.txt","w");
        pcm = fopen("result.pcm","wb");
        long start = clock();
        while(av_read_frame(pInFmtCtx, &packet)>=0)//pInFmtCtx中调用对应格式的packet获取函数
        {
            //fprintf(packetinfo," packet { pts=%d; dts =%d;%x,%x,%x,%x; size=%d; stream_index=%d; pos=%d;}\n",

            // packet.pts,packet.dts,packet.data[0],packet.data[1],packet.data[2],packet.data[3],packet.size,packet.stream_index,packet.pos);

            if(packet.stream_index==audioStream)//如果是音频
            {
                pktdata = packet.data;
                pktsize = packet.size;
                while(pktsize>0)
                {
                    //fprintf(packetinfo,"packet data:%x %x %x %x %x\n",pktdata[0],pktdata[1],pktdata[2],pktdata[3],pktdata[4]);

                    //fprintf(packetinfo,"packet size:%d\n\n",pktsize);

                    out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE*100;
                    //解码
                    int len = avcodec_decode_audio2(pInCodecCtx,(short*)inbuf,&out_size,pktdata,pktsize);
                    if (len<0)
                    {
                        printf("Error while decoding.\n");
                        break;
                    }
                    if(out_size>0)
                    {
                        fwrite(inbuf,1,out_size,pcm);//pcm记录
                        fflush(pcm);
                    }
                    pktsize -= len;
                    pktdata += len;
                }
            } 
            av_free_packet(&packet);
        }
        long end = clock();
        printf("cost time :%f\n",double(end-start)/(double)CLOCKS_PER_SEC);
        free(inbuf);
        fclose(pcm);
        fclose(packetinfo);
        if (pInCodecCtx!=NULL)
        {
            avcodec_close(pInCodecCtx);
        }
        if (test!=NULL)
        {
            avcodec_close(test);
        }
        av_free(test);
        av_close_input_file(pInFmtCtx);
        return 0;
}

转自:http://blog.chinaunix.net/u3/108358/showart_2132123.html


FFmpeg 音频解码:应用buffer缓冲机制 如需转载请注明出处! 之前文章有介绍,在FFmpeg成功编译并采用精简configure配置项方案后,成功实现了所需音频格式的解码,并开发实现了解码器的demo,能够对本地的音频文件进行解码输出,限于项目属性不便公开源码。为了实现解码器同播放器的衔接,需要实现decoder的buffer 缓冲解码机制,即播放器传递音频压缩数据给decoder,decoder解码后将PCM数据输出。 阅读详情

相关推荐

ffmpeg 解码h264数据

本文内容均为原创,转载请注明出处。 使用ffmpeg解码h264数据其实相对使用x264进行视频编码是简单了许多的,因为ffmpeg提供了一个decoding_encoding.c的文件,这个文件里面有简单的使用ffmpeg进行视频、音频编解码的例子,不过可能有的人也会找不到这个示例,我就讲我改造过的这个示例放在这里,同时加一些解释。 其中需要注意的的一点我需要在此说明,就是ffmpeg在

一个健忘症患者的记忆备份 1万+

FFmpeg 代码学习example01:decode_video

Version:FFmpeg 4.4 Source: "example" folder /* * Copyright (c) 2001 Fabrice Bellard * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal *..

SigMap 1038

FFmpeg简易播放器的实现-音频播放

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文件解码和调用SDL播放两大部分。 本实验仅研究音频播放的实现方式,不考虑视频。在开始前,可先参考如下文章了解播放器的基本流程: “FFmpeg简易播放器的实现-最简版” 1. 视频播放器基本原理 下图...

叶余的博客 1437

JavaCV升级1.5.6之后遇到h265/hevc编码的视频无法打开编解码器avcodec_open2() error -1:Could not open video codec异常解决办法

h265/hevc编码的视频无法打开编解码器问题 遇到问题: 升级或使用1.5.6版本的JavaCV后运行报avcodec_open2() error -1:Could not open video codec错误。 原因: 这是因为1.5.6开始javacv不再默认包含gpl许可协议的编解码库,涉及到的库包含:libx264、libx265等等 如何解决: 在原有的基础上添加一个gpl依赖 <dependency> <groupId>org.bytedeco</g

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 6875

FFmpeg 3 跨平台视音频编解码入门基础

FFmpeg 学习之路,个人通过多方资料阅读而得出的,做个记录,也分享给其他人,降低不必要的社会劳动力。

学习是一种信仰。 1006

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 394

基于FFmpeg的AVDevice例子读取摄像头调试记录

FFmpeg中有一个和多媒体设备交互的类库:Libavdevice。使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上。Libavdevice支持以下设备作为输入端:alsaavfoundationbktrdshowdv1394fbdevgdigrabiec61883jacklavfilibcdiolibdc1394openalosspulseqtkits...

tigerxuchuanli的专栏 1329

Win11专业版破解RDP限制:实现多用户远程桌面协同办公

本文详细介绍了如何在Windows 11专业版上破解RDP限制,实现多用户远程桌面协同办公。通过使用RDPWrap工具,用户可以绕过微软的授权限制,允许多个用户同时登录同一台电脑,提高硬件利用率和团队协作效率。文章包含详细的安装配置步骤、性能优化技巧及常见问题解决方案,适用于需要远程协作的办公场景。

weixin_33806300的博客 465

JavaCV error AAC with no global headers is currently not supported

意思就是缺少全局头部信息的AAC编码器不被支持,那么給它添加一些配置信息即可。

zhou_Tian的博客 1291

泛微E9与金蝶云星空单点登录集成实战指南

本文详细介绍了泛微E9与金蝶云星空单点登录(SSO)集成的实战指南,包括前期准备、核心代码实现、常见问题排查及安全加固建议。通过集成,企业可实现一次登录全网通行,显著提升工作效率和安全性。文章特别强调了签名生成机制和跳转URL构造的关键技巧,帮助开发者避免常见错误。

weixin_30689307的博客 534

保姆级教程:在mmdetection中手动计算并可视化P、R、F1值(附完整代码)

本文提供了一份详细的mmdetection教程,指导开发者如何手动计算并可视化精确率(P)、召回率(R)和F1值。通过完整的代码示例和清晰的步骤说明,帮助用户深入理解目标检测模型的性能评估方法,特别适合需要精细分析模型表现的计算机视觉研究人员和工程师。

weixin_29038303的博客 397

FFmpeg开发实战(一):FFmpeg 打印日志

在Visual Studio 开发(二):VS 2017配置FFmpeg开发环境 一文中,我们配置好了FFmpeg的开发环境,下面我们开始边实战,边学习FFmpeg。 首先,我们要学习的就是FFmpeg的日志输出系统 。 一、FFmpeg 日志输出系统介绍 FFmpeg 日志输出的核心函数方法为: av_log() 。为什么说av_log()是FFmpeg中输出日志的核心函数函数?...

weixin_30385925的博客 751

uniapp+萤石视频监控实战:解决ezuikit.js真机调试不显示的5个关键步骤

本文针对Uniapp集成萤石视频监控时ezuikit.js在真机调试中黑屏不显示的问题,提供了5个关键解决步骤。核心方案是采用Webview加载独立H5播放页,以规避跨平台环境差异,并详细阐述了资源放置、多端适配、通信处理及系统化排查方法,确保视频流稳定播放。

weixin_29001655的博客 286

FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 原博主博客导航:https://blog.youkuaiyun.com/qq21497936/article/details/102478062 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/108799279 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6503

TMS320F28377D双核开发例程 - DSP开发

首先,我们需要创建一个新的工程来进行开发。然后,选择适当的目标设备为TMS320F28377D,并设置工程的名称和存储位置。在上面的代码中,我们定义了一个128个元素的输入数组和输出数组。然后,我们使用一个简单的数字信号处理算法,将输入数组中的每个元素平方,并将结果存储到输出数组中。这个芯片的双核架构提供了更高的计算能力和灵活性,使得数字信号处理的开发更加高效和可靠。希望本文对您有所帮助!当应用程序在TMS320F28377D芯片上运行时,它将对输入数组中的每个元素进行平方运算,并将结果打印出来。

IfllUnity的博客 2516

FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 原博主博客导航:https://blog.youkuaiyun.com/qq21497936/article/details/102478062 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/108648385 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

【Proteus仿真】基于74LS148+74LS279+74LS48的四路抢答器

perseverance51博客 8831

FFmpeg从入门到牛掰(三):音频解码(decode)讲解

教你如何将音频帧解码成pcm,同时带你认识音频解码的常规知识

impingo的博客 2867

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FFmpeg开发笔记(十二):ffmpeg音频处理、采集麦克风音频录音为WAV

本文介绍了使用FFmpeg和SDL捕获并播放音频流的方法。主要内容包括:通过FFmpeg命令行获取设备列表,分析音频源、编解码器、采样参数等概念;详细说明音频录制流程的四步骤(设备探测、数据采集、编码处理和封装)。文章提供了Demo源码,展示如何从USB麦克风捕获音频并转为PCM格式,最终使用SDL进行播放。特别说明Windows系统下需通过DirectShow接口访问音频设备,并给出了相关命令行操作示例。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 9704

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

开源ffmpeg(三)——音频拉流、解码以及重采样

对于ffmpeg介绍和如何输出ffmpeg日志可以参照之前的博客。该篇博客是用于学习如何使用ffmpeg进行读取音频(包括本地和远端),并对读取流进行音频解码、以及进行重采样的操作。如果现在看官对于音频解码不是很熟悉,建议可以多看看雷神的文章,膜拜+缅怀雷神。视音频编解码技术零基础学习方法PCM音频数据格式介绍|版本声明:山河君,未经博主允许,禁止转载流上下文、解码器、重采样工具。流上下文:用于读包解码器:将读取的包进行解码为pcm重采样工具:将pcm数据重采样为需要的格式。...

专注音视频底层算法与工程实现,深入解析数字信号处理。深入研究WebRTC 3A、多麦声源定位、vad、语音识别等技术 3351

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ffmpeg解码音频流

//初始化、注册编解码器 avcodec_init(); av_register_all(); avformat_network_init(); //选取测试文件 char* FileName="test.mp4"; string strFileName(FileName); WavMaker test(AudioName.c_str());//初始化wav对象 ...

aig8440的博客 269

FFmpeg从入门到牛掰(六):音频转码讲解

转载请注明出处:https://blog.youkuaiyun.com/impingo 项目地址:https://github.com/im-pingo/pingos 音频转码讲解描述系列目录串讲 描述 本篇文章主要介绍ffmpeg中音频解码、重采样以及编码的API接口。前面的文章已经用三章分别介绍了在这过程中使用到的API函数,这篇文章将会把之前提到的API串起来讲解。 系列目录 FFmpeg从入门到牛掰(...

impingo的博客 1951

FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/109603499 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门) FFmpeg和SDL开发专栏(点击传送门) 上一篇:《FFmpeg开发笔记(八):ffmpeg

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

FFmpeg开发笔记(十三):ffmpeg采集麦克风音频pcm重采样为aac录音为AAC文件

本文介绍了使用FFmpeg进行音频重采样和编码的技术流程,重点解决音频录制中的噪声问题。文章首先概述了音频采集、解码、重采样和封装的基本流程,指出噪声来源于输入输出帧大小不匹配导致的相位不连续。针对这一问题,作者提出了三种解决方案:调整采集参数、补零处理和使用缓冲区。其中详细讲解了使用AVAudioFifo缓冲区的实现方法,包括创建、写入、读取和释放缓冲区的关键代码。最后展示了无缓冲处理的Demo代码框架,包括设备注册、参数设置、设备打开和音频流获取等步骤。这篇技术文章为开发者提供了处理音频重采样噪声问题的

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 9812

ffmpeg 多路 同时 解码_ffmpeg入门教程

@[TOC]## 首先推荐几本必参考的书《FFmpeg从入门到精通》,命令行居多《FFmpeg基础库编程开发》,各种标准发展历史及原理居多《音视频开发进阶指南基于Android与iOS平台的实践》## 视频播放器原理此处摘抄部分为优快云博主「雷霄骅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:[[总结]视音频编解码技术零基础学习方法_雷霄骅(l...

weixin_42330839的博客 1758
上一篇: Android利用Achartengine实现实时曲线图
下一篇: Android使用AChartEngine制作动态心电图效果
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值