android - sistematico - tipos de muestreo en quimica analitica pdf
FFmpeg y tipos de muestras (2)
Mantenga un contador de bytes decodificados que se acumula con len
después de cada llamada a avcodec_decode_audio
para un solo AVPacket
. Luego utilícelo como compensación en la matriz de bytes de 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;
Está sobrescribiendo el principio del búfer una y otra vez en lugar de anexar.
Audio decodificado usando FFmpeg (función avcodec_decode_audio3) e intenta reproducirlo a través de Audiotrack en Android. Cuando juego, escucho algunos gruñidos. Sin musica. En los foros aconsejó que el problema con las muestras. Pregunta: ¿cómo resolver este problema, si está asociado con una falta de coincidencia de tipos de muestras? Descodificación de código:
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;
}
}
}
Código 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);
}
¿Cómo resolver este problema? PD El archivo en sí está marcado: el reproductor estándar se reproduce. Formato: mp3.
aquí está mi código de decodificación de audio, espero que te ayude.
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);
}
}