FFmpeg и типы образцов - PullRequest
       10

FFmpeg и типы образцов

2 голосов
/ 27 марта 2011

Расшифруйте аудио с помощью FFmpeg (функция avcodec_decode_audio3) и попробуйте воспроизвести его через Audiotrack в Android.Во время игры я слышу рычание.Нет музыкиНа форумах сообщается, что проблема с образцами.Вопрос: как решить эту проблему, если она связана с несоответствием типов образцов?Расшифровка кода:



        while (av_read_frame(pFormatCtx, &packet)>= 0) {
            if (aCodecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
                        int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2;
                        int size=packet.size;
 int decoded = 0;
                        while(size > 0) {
                                int len = avcodec_decode_audio3(aCodecCtx, (uint16_t *) pAudioBuffer, &data_size, &packet);


                                jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL);
                                memcpy(bytes + decoded, (uint16_t *) pAudioBuffer, len);
                                (*env)->ReleaseByteArrayElements(env, array, bytes, 0);

                                (*env)->CallStaticVoidMethod(env, cls, mid, array);


                                size -= len;
                                decoded += len;
                                }
            }

     }

Код Java:


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

         int bufSize = AudioTrack.getMinBufferSize(44100,                                AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                        AudioFormat.ENCODING_PCM_16BIT);
        track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                    AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM);
        track.play();

            bytes = new byte[bufSize];
            int res = main(2, "/sdcard/muzika_iz_reklami_bmw_5_series_-_bmw_5_series.mp3", bytes);


            System.out.println(res);
    }
    private static void play(byte[] play) {

        track.write(play, 0, play.length);
    }

Как решить эту проблему?PS Сам файл проверен - играет стандартный плеер.Формат: mp3.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

вот мой код декодирования звука, надеюсь, он вам поможет.

int16_t* samples = (int16_t*)av_malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
int sample_size;

while(!m_quit && av_read_frame_wrapper(m_pAVFormatContext, &packet) >= 0) {
    if(packet.stream_index == m_audioStream) {
        org_data = packet.data;
        org_size = packet.size;
        LOGV("audio packet size = %d", packet.size);
        while (!m_quit && packet.size > 0) {
            sample_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
            len = avcodec_decode_audio3(m_pAVCodecContext, samples, &sample_size, &packet);
            LOGV("sample_size = %d, len = %d", sample_size, len);
            if (len < 0) {
                LOGE("Error when decoding...");
                break;
            }

            if (sample_size > 0) {
                //begin = now_ms();

                //audio_output_native(samples, sample_size);

                /* use audio queue */
                SampleNode* node = new SampleNode(samples, sample_size);
                m_pSampleQueue->enqueue(node);

                //end = now_ms();

                //LOGV("sample_size > 0, output audio samples cost %llu ms\n", end - begin);
            }
            packet.size -= len;
            packet.data += len;
        }

        packet.size = org_size;
        packet.data = org_data;

        av_free_packet(&packet);
    } else {
        av_free_packet(&packet);
    }
}
1 голос
/ 27 марта 2011

Сохраняет счетчик декодированных байтов, который накапливается с len после каждого вызова на avcodec_decode_audio для одного AVPacket.Затем используйте его как смещение в байтовом массиве Java:

int decoded = 0;
  ...
int len = avcodec_decode_audio3(aCodecCtx, (uint8_t *) pAudioBuffer, &data_size, &packet);
  ...
memcpy(bytes + decoded, (uint8_t *) pAudioBuffer, len);
  ...
size -= len;
decoded += len;

Вы перезаписываете начало буфера снова и снова вместо добавления.

...