ffmpeg库音频解码示例

news/2024/7/7 21:49:31

一个英文版的例子(有讲解)
ffmpeg的一些使用例子
mpeg and SDL Tutorial
ffmpeg编译相关
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://www.niftyadmin.cn/n/3612821.html

相关文章

关于H264,X264,DivX,Xvid的小知识(转载)

HDTV的概念HDTV即High-Definition TV &#xff0c;高清晰数字电视。这个概念其实可以非常简单地表达出来。所谓“数字”&#xff0c;是相对于原来的“模拟”而言&#xff0c;是指拍摄、编辑、制作、传输、接收等全过程都使用数字技术的电视系统。所谓“高清晰”&#xff0c;则是…

如何在浏览器中获取当前执行的脚本文件名

背景 同事提了一个问题&#xff0c;如何在浏览器中动态插入的 JavaScript 文件中&#xff0c;获取当前文件名&#xff1f; 除了服务器输出一个文件名外&#xff0c;在脚本中获取应该只有下面三种做法。 解法A 普遍的解法&#xff0c;只能用于页面静态scripts标签引入或者单个动…

视频播放的基本原理(转)

当初看VLC代码花了不少时间&#xff0c;其中很大的原因是不太了解视频播放的基本原理。现在看来&#xff0c;几乎所有的视频播放器&#xff0c;如VLC、MPlayer、Xine&#xff0c;包 括DirectShow&#xff0c;在播放视频的原理和架构上都是非常相似的&#xff0c;理解这个对理解…

wav 文件结构

WAVE是录音时用的标准的WINDOWS文件格式&#xff0c;文件的扩展名为“WAV”&#xff0c;数据本身的格式为PCM或压缩型。 WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准&#xff0c;它采用RIFF文件格式结构&#xff0c;非常接近于AIFF和IFF格式。符合 PIFF R…

修复FCKEditor .Net上传时候Permission denied错误

在使用FCKeditor时&#xff0c;如果使用“上传”对话框上传文件&#xff0c;可能导致客户端出现"权限被拒绝 (Permission denied)"错误。 解决方法 使用VS2005打开FredCK.FCKeditorV2.vs2005.csproj&#xff0c;打开FileBrowser > FileWorkerBase.cs&#xff0c;在…

FLV文件格式(Z)

刚才在看一些关于demux的东西&#xff0c;在处理flv格式的文件的时候&#xff0c;由于自己对flv文件的格式不了解&#xff0c;所以就比较云头转向&#xff0c;正好看到了一篇讲述flv文件格式的文章&#xff0c;写的比较明白&#xff0c;所以就转过来了。O(∩_∩)O~flv头文件比较…

Multithread 之 synchronous

Critical Sections&#xff08;临界区&#xff09;&#xff1a;用来实现“排他性占用”。适用范围是单一进程的各线程之间。一个局部对象&#xff0c;不是一个核心对象快速而有效率不能同时有一个以上的Critical Section被等待无法侦测是否已被某个线程放弃例子&#xff1a; #i…

创业在微软——微软亚洲工程院成长启示(双色)

创业在微软——微软亚洲工程院成长启示&#xff08;双色&#xff09; 许凤婷 编著ISBN 978-7-121-13410-4 2011年8月出版定价&#xff1a;39.00元16开424页宣传语&#xff1a;身处软件业巨擘微软&#xff0c;何来创业一说谋士&#xff1f;说客&#xff1f;人贩&#xff1f;IT精…