• ffmpeg .any to .pcm


     {

    提取
    ffmpeg -i xxxx.mp4 -codec:a  pcm_f32le -ar 48000 -ac 2 -f f32le output.pcm
        -ar: 指定采样率;
        -ac: 指定声道数;
        -f f32le: 表示每个采样点用32位浮点数来表示(le表示小端,be表示大端)


    播放
    ffplay -ar 48000 -channels 2 -f f32le -i output.pcm
        -channels: 声道数

    }

    {

      ffmpeg -i input.aac -codec:a pcm_f32le -ar 48000 -ac 2 -f f32le output.pcm

    }

    {

    ffplay -ar 48000 -channels 2 -f f32le -i output.pcm

    }

    {

    #include    <stdlib.h>
    #include    <stdio.h>
    #include    <string.h>
    #include    <math.h>
    
    
    #include    <libavutil/opt.h>
    #include    <libavutil/mathematics.h>
    #include    <libavutil/imgutils.h>
    #include    <libavutil/samplefmt.h>
    #include    <libavutil/timestamp.h>
    #include    <libavformat/avformat.h>
    #include    <libavcodec/avcodec.h>
    #include    <libswscale/swscale.h>
    #include    <libavutil/mathematics.h>
    #include    <libswresample/swresample.h>
    #include    <libavutil/channel_layout.h>
    #include    <libavutil/common.h>
    
    int main(int argc, char * argv[])
    {
    const char *input;
    const char *outfilename = "test.pcm";
    const char *filename = "test.mp3";
    
    input = argv[1];
    
    av_register_all();
    avcodec_register_all();
    
    AVFormatContext    *iFormatCtx        = NULL;
    AVCodecContext     *iaCodecCtx        = NULL;
    AVCodec            *iaCodec           = NULL;
    AVFrame            *frame             = NULL;
    AVPacket           ipacket;
    av_init_packet(&ipacket);
    AVDictionary       *optionsDict       = NULL;
    
    struct SwsContext  *sws_ctx           = NULL;
    
    int                AudioStreamIndex;
    int                frameFinished;
    int                numBytes;
    int len;
    int i;
    FILE *f, *outfile;
    uint8_t *outbuf;
    uint8_t *outbuf3;
    uint8_t *outbuf2;
    uint8_t inbuf[1024+ FF_INPUT_BUFFER_PADDING_SIZE];
    
    iFormatCtx = avformat_alloc_context();
    if(avformat_open_input(&iFormatCtx, input, NULL, NULL)!=0)
    {
        printf("could not open input_file
    "); 
        return -1;
    }
    printf("The url: %s
    ", input);
    
    if(avformat_find_stream_info(iFormatCtx,NULL) < 0)//获取文件内音视频流的信息
        {
                printf("find stream info failed
    ");
                return -1 ;
        }     
    av_dump_format(iFormatCtx, 0, input, 0);
    
    AudioStreamIndex = -1;
    for(i=0; i<iFormatCtx->nb_streams; i++)
    {
        if(iFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO && AudioStreamIndex <0 )
        {
            AudioStreamIndex =  i;
            break;
        }
    }
    
    if(AudioStreamIndex== -1)
    {
        printf("Cannot find VideoStream
    ");
        return -1;
    }
    
    iaCodecCtx    = iFormatCtx->streams[AudioStreamIndex]->codec;
    iaCodec       = avcodec_find_decoder(iaCodecCtx->codec_id);
    if(iaCodec == NULL)
    {
        printf("unsupported codec!
    ");
        return -1;
    }
    
    if(iaCodec->capabilities & CODEC_CAP_TRUNCATED)
        iaCodecCtx->flags |= CODEC_CAP_TRUNCATED;
    
    
    if(avcodec_open2(iaCodecCtx, iaCodec, &optionsDict)<0)
    {
        printf("could not open the codec
    ");
        return -1;
    }
    
    outbuf = (uint8_t *)malloc(1024);
    
    f = fopen(filename, "rb");
        if (f) {
            printf("could not open %s
    ", filename);
            return -1;
        }
    outfile = fopen(outfilename, "wb");
    if (!outfile) {
            printf("open outfile failed
    ");
            av_free(iaCodecCtx);
            return -1 ;
        }
    
    frame = avcodec_alloc_frame();
    if (!frame) {
            fprintf(stderr, "Could not allocate audio frame
    ");
            exit(1);
        }
    
        //frame->nb_samples     = iaCodecCtx->frame_size;
        //frame->format         = iaCodecCtx->sample_fmt;
        //frame->channel_layout = iaCodecCtx->channel_layout;
    
    int pktsize = 0;
    uint8_t *pktdata;
    
    while(av_read_frame(iFormatCtx, &ipacket)>=0) 
    {
        if(ipacket.stream_index == AudioStreamIndex)
        {
    
            while(ipacket.size>0)
            {    
            int out_size;
            len = avcodec_decode_audio4(iaCodecCtx, frame, &out_size, &ipacket);
            if (len < 0) 
            {
                pktsize = 0;
                printf("Error while decoding
    ");
                continue;
            }
            if (out_size ) 
            {
            int data_size1 = av_samples_get_buffer_size(NULL, iaCodecCtx->channels, frame->nb_samples, iaCodecCtx->sample_fmt, 1);    
                //fwrite(frame->data[0], 1, data_size1, outfile);
                fwrite(frame->data[0], 1, frame->linesize[0], outfile);
                fflush(outfile);
            }
                ipacket.size -=len;
                ipacket.data +=len;
            } 
        }
    }
    
    return 0;
    }

    }

  • 相关阅读:
    maven常用命令
    div标签width:auto无效
    将本地文件推送到码云
    Spring事件监听讲解
    常用js代码积累
    HTML中块级元素和行内元素的总结和区分
    box-shadow详解
    设置最小宽高的作用
    Java英语词汇表
    标识符
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/13200218.html
Copyright © 2020-2023  润新知