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);
:
生フレームの長さは、によって計算しなければなりませんか? initのステップは失敗しますか?またはデコードのステップ?または、すべての呼び出しは成功しますが、オーディオデータが正しく発音されませんか?それはどうやってテストしましたか?デコーダへの入力としてデータを提供する前に、RTPペイロードパーサーを介してRTPデータを実行しましたか?あなたのコードを実行している間にstderrにメッセージを受け取っていますか? –
私はRTPを解析しました。バッファーには、OPUSパケットだけがあります。私は、liboupusのopus_decodeと並行して作業しています。しかし、libavcodecを使用しないでください。主な問題は何のエラーも生じません。 initまたは何も失敗します。 avcodec_decode_audio4は、デコードのために送信した私のopusパケットのパケットサイズを持つフレームを返します。エラーメッセージは表示されません。それは主な問題です – Abu
avcodec_decode_audio4()内の「client_sockt_num_1」はタイプミスですか? –