Saya melihat contoh dari ffmpeg docs: Di sini

static int output_audio_frame(AVFrame *frame)
{
    size_t unpadded_linesize = frame->nb_samples * av_get_bytes_per_sample(frame->format);
    printf("audio_frame n:%d nb_samples:%d pts:%s\n",
           audio_frame_count++, frame->nb_samples,
           av_ts2timestr(frame->pts, &audio_dec_ctx->time_base));
    /* Write the raw audio data samples of the first plane. This works
     * fine for packed formats (e.g. AV_SAMPLE_FMT_S16). However,
     * most audio decoders output planar audio, which uses a separate
     * plane of audio samples for each channel (e.g. AV_SAMPLE_FMT_S16P).
     * In other words, this code will write only the first audio channel
     * in these cases.
     * You should use libswresample or libavfilter to convert the frame
     * to packed data. */
    fwrite(frame->extended_data[0], 1, unpadded_linesize, audio_dst_file);
    return 0;
}

Masalahnya adalah format dekoder tidak dapat disetel sehingga akan memberi saya sampel audio dalam salah satu jenis berikut:

enum AVSampleFormat {
      AV_SAMPLE_FMT_NONE = -1, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
      AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8P, AV_SAMPLE_FMT_S16P,
      AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_DBLP, AV_SAMPLE_FMT_S64,
      AV_SAMPLE_FMT_S64P, AV_SAMPLE_FMT_NB
    }

Saya bekerja dengan mesin suara dan mesin mengharuskan saya untuk mengirim data PCM float [-1 ke 1] ke mesin jadi saya ingin mendapatkan data audio frame sebagai float untuk dua saluran (musik stereo). Bagaimana saya bisa melakukannya? Apakah saya perlu menggunakan libswresample? Jika demikian, adakah yang bisa mengirimi saya contoh untuk kasus saya?

0
cs guy 20 November 2020, 18:46

1 menjawab

Jawaban Terbaik

Jika Anda tidak mendapatkan format yang diinginkan dari dekoder, Anda harus mengambil sampel ulang, encode dengan AV_SAMPLE_FMT_FLT.

Menurut enum AVSampleFormat

  • Format floating-point didasarkan pada volume penuh yang berada dalam kisaran [-1.0, 1.0]. Nilai apa pun di luar rentang ini berada di luar tingkat volume penuh.

Semua Contoh didokumentasikan dengan baik dan tidak terlalu rumit. Nama fungsi saja sudah sangat jelas, jadi seharusnya tidak terlalu sulit untuk dipahami.

1
Erdal Küçük 20 November 2020, 16:25