Encode PCM S16LE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I am trying to capture the "default" audio output using alsa API and use ffmpeg to compress the raw stream. I set the captured format to be SND_PCM_FORMAT_S16_LE and use CODEC_ID_MP2 from ffmpeg to compress the captured stream. For some reasons, the output stream is corrupted and I can hear periodic bursting noise in the resulted audio. When I tell ffmpeg to use CODEC_ID_PCM_S16LE to compress the captured stream, the output stream is good. Is there any kind of post processing I need to do to the captured stream before I can compress? Here is roughly what my code looks like:

    ret = snd_pcm_open(&handle, "default",
                    SND_PCM_STREAM_CAPTURE, 0);
    snd_pcm_hw_params_alloca(&params);
    snd_pcm_hw_params_any(handle, params);
    snd_pcm_hw_params_set_access(handle, params,
                      SND_PCM_ACCESS_RW_INTERLEAVED);
    snd_pcm_hw_params_set_format(handle, params,
                              SND_PCM_FORMAT_S16_LE);
    snd_pcm_hw_params_set_channels(handle, params, 2);
    snd_pcm_hw_params_set_rate_near(handle, params,
                                  &val, &dir);
    frames = 32;
    snd_pcm_hw_params_set_period_size_near(handle,
                                params, &frames, &dir);
    audio_buffer_size = frames * 4; /* 2 bytes/sample, 2 channels */
    audio_buffer = av_malloc(audio_buffer_size);
    ret = snd_pcm_hw_params(handle, params);
    snd_pcm_hw_params_get_period_size(params,
                                        &frames, &dir);

    /* .................... */

    /* ffmpeg */
    audio_st = av_new_stream(formatContext, 1);
    if (!audio_st) {
        fprintf(stderr, "Could not alloc audio stream\n");
        exit(1);
    }
    pAudioCxt = audio_st->codec;
    pAudioCxt->codec_id = pOutputFmt->audio_codec;
    pAudioCxt->codec_type = CODEC_TYPE_AUDIO;

    /* sample parameters */
    pAudioCxt->bit_rate = 64000;
    pAudioCxt->sample_rate = 44100;
    pAudioCxt->channels = 2;

    /* find audio codec */
    /*pAudioCodec = avcodec_find_encoder(pAudioCxt->codec_id);*/

    /* capture */
    ret = snd_pcm_readi(handle, audio_buffer, frames);

    /* encode */
    out_size = avcodec_encode_audio(pAudioContext, enc_aud_buff,
                audio_buffer_size, (short *)audio_buffer);

Thanks,
Mik
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Alsa-user mailing list
Alsa-user@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-user

[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux