1

C++ で FFMPEG を使い始めたばかりで、オーディオ デコーダーをコーディングしてから、デコードされたオーディオをファイルに書き込もうとしました。

ただし、出力ファイルに書き込むデータがわかりません。サンプルコードを見る限りでは、AVFrame -> data[0]. しかし、コンソールに印刷しようとすると、プログラムを実行するたびに異なる乱数が表示されます。AVFrame->data[0]そして、これをファイルに書き込もうとすると、エラーが発生し続けます。

私の質問は、関数を呼び出した後、デコードされたオーディオをどのように書き込むことができるかということav_codec_decode_audio4です。

以下にコードを添付し、PC 上の有効な mp3 ファイルのパスである引数「C:\02.mp3」を渡します。

ご協力ありがとうございました。

// TestFFMPEG.cpp : Audio Decoder
//

#include "stdafx.h"

#include <iostream>
#include <fstream>
#include <sstream>

extern "C" {
    #include <avcodec.h>
    #include <avformat.h>
    #include <swscale.h>

}

using namespace std;


int main(int argc, char* argv[])
{
int audioStream = -1;

AVCodec         *aCodec;
AVPacket        avPkt;
AVFrame         *decode_frame = avcodec_alloc_frame();

AVCodecContext  *aCodecCtxt;
AVFormatContext *pFormatCtxt = NULL;

if(argc != 2) {     // Checking  whether there is enough argument
    return -1; 
}

av_register_all();  //Initialize CODEC
avformat_network_init();
av_init_packet (&avPkt);


 if (avformat_open_input (&pFormatCtxt, argv[1],NULL,NULL)!= 0 ){ //Opening File
     return -2;
 }

 if(avformat_find_stream_info (pFormatCtxt,NULL) < 0){ //Get Streams Info 
     return -3; 
 }

 AVStream *stream = NULL;
 //av_read_play (pFormatCtxt); //open streams


 for (int i = 0;  i < pFormatCtxt->nb_streams ; i++) { //Find Audio Stream
     if (pFormatCtxt->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO){
         audioStream =i;
     }
 }

 aCodecCtxt = pFormatCtxt ->streams [audioStream]->codec; // opening decoder   
 aCodec = avcodec_find_decoder( pFormatCtxt->streams [audioStream] ->codec->codec_id);

 if (!aCodec) {
     return -8;
 }

 if (avcodec_open2(aCodecCtxt,aCodec,NULL)!=0) {
     return -9; 
 } 

int cnt = 0;

while(av_read_frame(pFormatCtxt,&avPkt) >= 0 ){

    if (avPkt.stream_index == audioStream){
        int check = 0; 
        int result = avcodec_decode_audio4 (aCodecCtxt,decode_frame,&check, &avPkt);
        cout << "Decoded : "<< (int) decode_frame->data[0] <<", "<< "Check : " << check << ", Format :" << decode_frame->format <<" " << decode_frame->linesize[0]<< " "<<cnt <<endl;
    }
    av_free_packet(&avPkt);
    cnt++;
}


return aCodec ->id;  
} 
4

2 に答える 2

1

あなたはそれを正しくやっています。

デコードするデータには、ポインタ decode_frame->data[0]が含まれています。バイト単位のデータ サイズはdecode_frame->linesize[0]で、オーディオ サンプル数は ですdecode_frame->nb_samples

したがって、次のようにオーディオ データを独自のバッファにコピーできます。

memcpy(OutputBuffer, decode_frame->data[0], decode_frame->linesize[0]);

于 2013-06-06T10:37:26.510 に答える
0

デコードされたオーディオ サンプルを直接提供する ffms2 を使用してみることができます。内部的には ffmpeg/libav を使用していました。したがって、デコードについて心配する必要はありません。

https://code.google.com/p/ffmpegsource/

于 2013-06-06T08:13:47.907 に答える