Skip to content

Commit e7510de

Browse files
committed
ijkplayer解码回调音频pcm数据流
1 parent 526ef83 commit e7510de

File tree

9 files changed

+77
-0
lines changed

9 files changed

+77
-0
lines changed

android/ijkplayer/ijkplayer-exo/src/main/java/tv/danmaku/ijk/media/exo/IjkExoMediaPlayer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public boolean getCurrentFrame(Bitmap var1) {
9494
@Override
9595
public void setFrameSpeed(float speed) { }
9696

97+
@Override
98+
public void setAudioDecodePCMCallback(AudioDecodeCallback callback) {}
99+
97100
@Override
98101
public void setMaxPacketNum(int num) {}
99102

android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/AndroidMediaPlayer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ public boolean getCurrentFrame(Bitmap var1) {
140140
@Override
141141
public void setFrameSpeed(float speed) { }
142142

143+
@Override
144+
public void setAudioDecodePCMCallback(AudioDecodeCallback callback) {}
145+
143146
@Override
144147
public void setMaxPacketNum(int num) {}
145148

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package tv.danmaku.ijk.media.player;
2+
3+
public interface AudioDecodeCallback {
4+
void audioDecodePcmDataHandle(byte[] data, int len);
5+
}

android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IMediaPlayer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,5 @@ interface OnTimedTextListener {
219219
boolean getCurrentFrame(Bitmap var1);
220220
void setFrameSpeed(float speed);
221221
void setMaxPacketNum(int num);
222+
void setAudioDecodePCMCallback(AudioDecodeCallback callback);
222223
}

android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,4 +1297,6 @@ public String onMediaCodecSelect(IMediaPlayer mp, String mimeType, int profile,
12971297
public native void setFrameSpeed(float speed);
12981298
@Override
12991299
public native void setMaxPacketNum(int num);
1300+
@Override
1301+
public native void setAudioDecodePCMCallback(AudioDecodeCallback callback);
13001302
}

android/ijkplayer/ijkplayer-java/src/main/java/tv/danmaku/ijk/media/player/MediaPlayerProxy.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ public boolean getCurrentFrame(Bitmap var1) {
102102
public void setFrameSpeed(float speed) {
103103
}
104104

105+
@Override
106+
public void setAudioDecodePCMCallback(AudioDecodeCallback callback) {}
107+
105108
@Override
106109
public void setMaxPacketNum(int num) {}
107110

ijkmedia/ijkplayer/android/ijkplayer_jni.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ static player_fields_t g_clazz;
6161
static int inject_callback(void *opaque, int type, void *data, size_t data_size);
6262
static bool mediacodec_select_callback(void *opaque, ijkmp_mediacodecinfo_context *mcc);
6363

64+
typedef void (*audio_decode_pcm_handle_t)(uint8_t *pcm_buf, size_t pcm_len);
65+
void setAudioDecodePCMCallback(audio_decode_pcm_handle_t audio_decode_handle);
66+
67+
typedef struct jni_info_player {
68+
JavaVM *jvm;
69+
JNIEnv *jenv;
70+
jobject jobj;
71+
jmethodID jmid;
72+
} jni_info_s_player;
73+
static jni_info_s_player audio_jni_player = {nullptr, nullptr, nullptr, nullptr};
74+
6475
static IjkMediaPlayer *jni_get_media_player(JNIEnv* env, jobject thiz)
6576
{
6677
pthread_mutex_lock(&g_clazz.mutex);
@@ -430,6 +441,33 @@ IjkMediaPlayer_setFrameSpeed(JNIEnv *env, jobject thiz, jfloat value)
430441
return;
431442
}
432443

444+
void _audio_decode_pcm_recv(uint8_t *data, size_t len) {
445+
if (audio_jni_player.jobj) {
446+
447+
JNIEnv *env;
448+
audio_jni_player.jvm->AttachCurrentThread(&env,0);
449+
jbyteArray array = env->NewByteArray(len);
450+
env->SetByteArrayRegion(array, 0, len, reinterpret_cast<jbyte *>(data));
451+
env->CallVoidMethod(audio_jni_player.jobj, audio_jni_player.jmid, array, len);
452+
env->DeleteLocalRef(array);
453+
audio_jni_player.jvm->DetachCurrentThread();
454+
} else {
455+
// LOGD_DEVICE("%s##[%s][%d]:no method id for avDataRecvHandle\n", __func__, __LINE__);
456+
}
457+
}
458+
459+
JNIEXPORT void JNICALL
460+
IjkMediaPlayer_setAudioDecodePCMCallback(JNIEnv *env, jobject thiz, jobject callback) {
461+
audio_jni_player.jobj = env->NewGlobalRef(callback);
462+
if (audio_jni_player.jobj) {
463+
jclass jclazz = env->GetObjectClass(audio_jni_player.jobj);
464+
sg_jni_device.jmid = env->GetMethodID(jclazz, "audioDecodePcmDataHandle", "([BI)V");
465+
setAudioDecodePCMCallback(_audio_decode_pcm_recv);
466+
} else {
467+
LOGD_DEVICE("callback object is null.\n");
468+
}
469+
}
470+
433471
static void
434472
IjkMediaPlayer_setMaxPacketNum(JNIEnv *env, jobject thiz, jint value)
435473
{
@@ -1278,6 +1316,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
12781316
return -1;
12791317
}
12801318
assert(env != NULL);
1319+
audio_jni_player.jvm = vm;
1320+
audio_jni_player.jenv = env;
12811321

12821322
pthread_mutex_init(&g_clazz.mutex, NULL );
12831323

@@ -1295,6 +1335,10 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
12951335

12961336
JNIEXPORT void JNI_OnUnload(JavaVM *jvm, void *reserved)
12971337
{
1338+
if (audio_jni_player.jobj) {
1339+
audio_jni_player.jenv->DeleteGlobalRef(audio_jni_player.jobj);
1340+
audio_jni_player.jobj = nullptr;
1341+
}
12981342
ijkmp_global_uninit();
12991343

13001344
pthread_mutex_destroy(&g_clazz.mutex);

ijkmedia/ijkplayer/ff_ffplay.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,6 +2491,12 @@ static int synchronize_audio(VideoState *is, int nb_samples)
24912491
return wanted_nb_samples;
24922492
}
24932493

2494+
audio_decode_pcm_handle_t ff_audio_decode_handle = NULL;
2495+
void setAudioDecodePCMCallback(audio_decode_pcm_handle_t audio_decode_handle)
2496+
{
2497+
ff_audio_decode_handle = audio_decode_handle;
2498+
}
2499+
24942500
/**
24952501
* Decode one audio frame and return its uncompressed size.
24962502
*
@@ -2645,6 +2651,12 @@ static int audio_decode_frame(FFPlayer *ffp)
26452651
resampled_data_size = data_size;
26462652
}
26472653

2654+
uint8_t *data = is->audio_buf;
2655+
size_t len = is->audio_buf_size;
2656+
if (ff_audio_decode_handle) {
2657+
ff_audio_decode_handle(data, len);
2658+
}
2659+
26482660
audio_clock0 = is->audio_clock;
26492661
/* update the audio clock with the pts */
26502662
if (!isnan(af->pts))

ijkmedia/ijkplayer/ff_ffplay.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,8 @@ void ffp_set_player_rate(FFPlayer *ffp, float speed);
129129
//设置追帧packet大小
130130
void ffp_set_player_maxpacket(FFPlayer *ffp, int num);
131131

132+
//音频解码pcm数据回调
133+
typedef void (*audio_decode_pcm_handle_t)(uint8_t *pcm_buf, size_t pcm_len);
134+
void setAudioDecodePCMCallback(audio_decode_pcm_handle_t audio_decode_handle);
135+
132136
#endif

0 commit comments

Comments
 (0)