2017-01-11 74 views
2

libavcodecを使ってopusをデコードしようとしています。私はlibopusライブラリだけを使ってそれを行うことができます。しかし、私はlibavcodecを使って同じことを達成しようとしています。私はそれを理解しようとしていますなぜ私のケースでは動作しません。私はrtpストリームを持っていて、それを解読しようとしています。デコードされたパケットの結果は入力と同じです。デコードされたフレームには、実際に送ったopusフレームを受け取る代わりに、pcm値が含まれています。私を助けてください。FFmpegのlibavcodecを使ってopusをデコードする

av_register_all(); 
avcodec_register_all(); 
AVCodec *codec; 
AVCodecContext *c = NULL; 
AVPacket avpkt; 
AVFrame *decoded_frame = NULL; 
av_init_packet(&avpkt); 
codec = avcodec_find_decoder(AV_CODEC_ID_OPUS); 
if (!codec) { 
    printf("Codec not found\n"); 
    exit(1); 
} 
c = avcodec_alloc_context3(codec); 
if (!c) { 
    printf("Could not allocate audio codec context\n"); 
    exit(1); 
} 
/* put sample parameters */ 
c->sample_rate = 48000; 
c->request_sample_fmt = AV_SAMPLE_FMT_FLT; 
c->channels = 2; 
/* open it */ 
if (avcodec_open2(c, codec, NULL) < 0) { 
    printf("Could not open codec\n"); 
    exit(1); 
} 

AVPacket avpkt; 
AVFrame *decoded_frame = NULL; 
av_init_packet(&avpkt); 
avpkt.data = Buffer; // Buffer is packet data here 
avpkt.size = len; // length of the packet 
int i, ch; 

if (!decoded_frame) { 
    if (!(decoded_frame = av_frame_alloc())) { 
     RELAY_SERVER_PRINT("Could not allocate audio frame\n"); 
     exit(1); 
    } 
} 
int ret; 
int got_frame = 0; 
ret = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt); 
if (ret < 0) { 
     fprintf(stderr, "Error decoding audio frame (%s)\n", av_err2str(ret)); 
     return ret; 
    } 
printf("length %i\n", decoded_frame->pkt_size); 
+0

生フレームの長さは、によって計算しなければなりませんか? initのステップは失敗しますか?またはデコードのステップ?または、すべての呼び出しは成功しますが、オーディオデータが正しく発音されませんか?それはどうやってテストしましたか?デコーダへの入力としてデータを提供する前に、RTPペイロードパーサーを介してRTPデータを実行しましたか?あなたのコードを実行している間にstderrにメッセージを受け取っていますか? –

+0

私はRTPを解析しました。バッファーには、OPUSパケットだけがあります。私は、liboupusのopus_decodeと並行して作業しています。しかし、libavcodecを使用しないでください。主な問題は何のエラーも生じません。 initまたは何も失敗します。 avcodec_decode_audio4は、デコードのために送信した私のopusパケットのパケットサイズを持つフレームを返します。エラーメッセージは表示されません。それは主な問題です – Abu

+0

avcodec_decode_audio4()内の「client_sockt_num_1」はタイプミスですか? –

答えて

1

私は同じ問題を抱えていました。私のストリームは8kHzでエンコードされ、ffmpegは常に48kHz(ハードコードされた)のlibopusを初期化しています。

はffmpegのコードスニペットを参照してください:

static av_cold int libopus_decode_init(AVCodecContext *avc) 
{ 
    (...) 
    avc->sample_rate = 48000; 
    avc->sample_fmt  = avc->request_sample_fmt == AV_SAMPLE_FMT_FLT ? 
          AV_SAMPLE_FMT_FLT : AV_SAMPLE_FMT_S16; 
    (...) 
} 

私がでていることに置き換えてきました:

if (avc->sample_rate == 0) 
    avc->sample_rate = 48000; 

と復号化が機能するようになりました。私はこのデコーダが動的なビットレートの変更をサポートしているのだろうかと思います。具体的にうまくいかない何

int frame_size = decoded_frame->nb_samples * av_get_bytes_per_sample(decoded_frame->sample_fmt); 
関連する問題