Skip to content

Commit 96bf664

Browse files
committed
更新gvoice的sdk,以及更改播放器回调pcm数据方式。
Change-Id: I8abd890bf15e7be9d9d4d2d0eb905d109be3f7fb
1 parent 2d9126e commit 96bf664

File tree

9 files changed

+57
-59
lines changed

9 files changed

+57
-59
lines changed
5.34 MB
Binary file not shown.

sdk/video-link-android/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.tencent.iot.video.link">
44
<uses-permission android:name="android.permission.RECORD_AUDIO" />
5+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
56
</manifest>

sdk/video-link-android/src/main/java/com/tencent/iot/video/link/util/audio/AudioRecordUtil.java

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class AudioRecordUtil implements EncoderListener, FLVListener, Handler.Ca
4343
private static final String TAG = AudioRecordUtil.class.getName();
4444
private static final int MSG_START = 1;
4545
private static final int MSG_STOP = 2;
46-
private static final int MSG_ENCODE = 3;
46+
private static final int MSG_REC_PLAY_PCM = 3;
4747
private static final int MSG_RELEASE = 4;
4848
private final HandlerThread readThread;
4949
private final ReadHandler mReadHandler;
@@ -81,7 +81,6 @@ public class AudioRecordUtil implements EncoderListener, FLVListener, Handler.Ca
8181
private static final int SAVE_PCM_DATA = 1;
8282

8383
private LinkedBlockingDeque<Byte> playPcmData = new LinkedBlockingDeque<>(); // 内存队列,用于缓存获取到的播放器音频pcm
84-
private AudioRecordUtilListener audioRecordUtilListener = null;
8584

8685
@Override
8786
public boolean handleMessage(@NotNull Message msg) {
@@ -92,8 +91,8 @@ public boolean handleMessage(@NotNull Message msg) {
9291
case MSG_STOP:
9392
stopInternal();
9493
break;
95-
case MSG_ENCODE:
96-
// renderInternal((TRTCCloudDef.TRTCVideoFrame) msg.obj);
94+
case MSG_REC_PLAY_PCM:
95+
recPlayPcmInternal((byte[]) msg.obj);
9796
break;
9897
case MSG_RELEASE:
9998
releaseInternal();
@@ -182,18 +181,6 @@ public AudioRecordUtil(Context ctx, String id, int sampleRate, int channel, int
182181
readThread.start();
183182
mReadHandler = new ReadHandler(readThread.getLooper(), this);
184183
}
185-
public AudioRecordUtil(Context ctx, String id, int sampleRate, int channel, int bitDepth, int pitch, AudioRecordUtilListener audioRecordUtilListener) {
186-
context = ctx;
187-
deviceId = id;
188-
this.pitch = pitch;
189-
this.enableAEC = true;
190-
this.enableAGC = true;
191-
this.audioRecordUtilListener = audioRecordUtilListener;
192-
init(sampleRate, channel, bitDepth);
193-
readThread = new HandlerThread(TAG);
194-
readThread.start();
195-
mReadHandler = new ReadHandler(readThread.getLooper(), this);
196-
}
197184

198185
private void init(int sampleRate, int channel, int bitDepth) {
199186
recordMinBufferSize = AudioRecord.getMinBufferSize(sampleRate, channel, bitDepth);
@@ -214,6 +201,7 @@ private void init(int sampleRate, int channel, int bitDepth) {
214201
recordMinBufferSize = (sampleRate*this.channelCount*this.encodeBit/8)/1000*20; //20ms数据长度
215202
Log.e(TAG, "20ms recordMinBufferSize is: "+ recordMinBufferSize);
216203
Log.e(TAG, "AudioRecordUtil init Pitch is: "+ pitch);
204+
GvoiceJNIBridge.init(context);
217205
}
218206

219207
public void recordSpeakFlv(boolean isRecord) {
@@ -282,6 +270,10 @@ public void setMode(VoiceChangerMode mode) {
282270
}
283271
}
284272

273+
public void setPlayerPcmData(byte[] pcmData) {
274+
mReadHandler.obtainMessage(MSG_REC_PLAY_PCM, pcmData).sendToTarget();
275+
}
276+
285277
/**
286278
* 开始录制
287279
*/
@@ -299,7 +291,6 @@ private void startInternal() {
299291
if (!playPcmData.isEmpty()) {
300292
playPcmData.clear();
301293
}
302-
GvoiceJNIBridge.init();
303294
reset();
304295
if (!VoiceChangerJNIBridge.isAvailable()) {
305296
if (st == null && pitch != 0) {
@@ -313,9 +304,6 @@ private void startInternal() {
313304
Log.e(TAG, "turn recorderState : " + recorderState);
314305
audioRecord.startRecording();
315306
new RecordThread().start();
316-
if (audioRecordUtilListener != null) {
317-
new WriteThread().start();
318-
}
319307
}
320308

321309
private void reset() {
@@ -459,8 +447,8 @@ public void run() {
459447
if (AudioRecord.ERROR_INVALID_OPERATION != read) {
460448
//获取到的pcm数据就是buffer了
461449
if (buffer != null && pcmEncoder != null) {
462-
if (audioRecordUtilListener != null) {
463-
byte [] playerPcmBytes = onReadPlayerPlayPcm(buffer.length);
450+
byte [] playerPcmBytes = onReadPlayerPlayPcm(buffer.length);
451+
if (playerPcmBytes != null && playerPcmBytes.length > 0) {
464452
byte[] aecPcmBytes = GvoiceJNIBridge.cancellation(buffer, playerPcmBytes);
465453
if (isRecord) {
466454
writePcmBytesToFile(buffer, playerPcmBytes, aecPcmBytes);
@@ -536,22 +524,13 @@ private byte[] onReadPlayerPlayPcm(int length) {
536524
}
537525
}
538526

539-
private class WriteThread extends Thread {
540-
@Override
541-
public void run() {
542-
while (recorderState) {
543-
if (audioRecordUtilListener != null) {
544-
byte[] data = audioRecordUtilListener.onReadPlayerPcmByte();
545-
if (data != null && data.length > 0) {
546-
Log.e(TAG, "data.length: " + data.length + " , recorderState : " + recorderState);
547-
List<Byte> tmpList = new ArrayList<>();
548-
for (byte b : data) {
549-
tmpList.add(b);
550-
}
551-
playPcmData.addAll(tmpList);
552-
}
553-
}
527+
private void recPlayPcmInternal(byte [] pcmData) {
528+
if (pcmData != null && pcmData.length > 0 && recorderState) {
529+
List<Byte> tmpList = new ArrayList<>();
530+
for (byte b : pcmData) {
531+
tmpList.add(b);
554532
}
533+
playPcmData.addAll(tmpList);
555534
}
556535
}
557536

sdk/video-link-android/src/main/java/com/tencent/iot/video/link/util/audio/AudioRecordUtilListener.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

sdkdemo/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ android {
5050
}
5151
}
5252
ndk {
53-
abiFilters 'armeabi-v7a'
53+
abiFilters 'arm64-v8a', 'armeabi-v7a'
5454
}
5555
}
5656
lintOptions {
@@ -139,9 +139,9 @@ dependencies {
139139

140140
// implementation 'com.tencent.iot.thirdparty.android:ijkplayer-java:1.0.7'
141141
// implementation 'com.tencent.iot.thirdparty.android:ijkplayer-armv7a:1.0.7'
142-
api 'com.tencent.iot.thirdparty.android:ijkplayer-java:2.0.12'
143-
api 'com.tencent.iot.thirdparty.android:ijkplayer-armv7a:2.0.12'
144-
api 'com.tencent.iot.thirdparty.android:ijkplayer-arm64:2.0.12'
142+
implementation 'com.tencent.iot.thirdparty.android:ijkplayer-java:2.0.14'
143+
implementation 'com.tencent.iot.thirdparty.android:ijkplayer-armv7a:2.0.14'
144+
implementation 'com.tencent.iot.thirdparty.android:ijkplayer-arm64:2.0.14'
145145

146146
implementation 'cn.aigestudio.wheelpicker:WheelPicker:1.1.3'
147147
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7-mpp-dev-11'

sdkdemo/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 往SDCard写入数据权限 -->
1212
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1313
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
14+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
1415

1516
<application
1617
android:name=".App"

sdkdemo/src/main/java/com/tencent/iot/explorer/link/demo/video/playback/cloudPlayback/VideoCloudPlaybackFragment.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,11 @@ class VideoCloudPlaybackFragment: VideoPlaybackBaseFragment(), TextureView.Surfa
463463
): Boolean {
464464
return false
465465
}
466+
467+
override fun onInfoAudioPcmData(mp: IMediaPlayer?, arrPcm: ByteArray?, length: Int) {
468+
469+
}
470+
466471
}
467472

468473
override fun onDestroy() {

sdkdemo/src/main/java/com/tencent/iot/explorer/link/demo/video/playback/localPlayback/VideoLocalPlaybackFragment.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@ class VideoLocalPlaybackFragment : VideoPlaybackBaseFragment(), TextureView.Surf
291291
): Boolean {
292292
return false
293293
}
294+
295+
override fun onInfoAudioPcmData(mp: IMediaPlayer?, arrPcm: ByteArray?, length: Int) {
296+
297+
}
294298
}
295299

296300
private var dlgOnClickedListener = object : CalendarDialog.OnClickedListener {

sdkdemo/src/main/java/com/tencent/iot/explorer/link/demo/video/preview/VideoPreviewActivity.kt

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,20 @@ import com.tencent.iot.explorer.link.demo.video.utils.VolumeChangeObserver
4343
import com.tencent.iot.video.link.consts.VideoConst
4444
import com.tencent.iot.video.link.entity.DeviceStatus
4545
import com.tencent.iot.video.link.util.audio.AudioRecordUtil
46-
import com.tencent.iot.video.link.util.audio.AudioRecordUtilListener
4746
import com.tencent.xnet.XP2P
4847
import com.tencent.xnet.XP2PCallback
4948
import kotlinx.android.synthetic.main.activity_video_preview.*
5049
import kotlinx.android.synthetic.main.dash_board_layout.*
5150
import kotlinx.android.synthetic.main.fragment_video_cloud_playback.*
5251
import kotlinx.android.synthetic.main.title_layout.*
5352
import kotlinx.coroutines.*
53+
import tv.danmaku.ijk.media.player.IMediaPlayer
5454
import tv.danmaku.ijk.media.player.IjkMediaPlayer
5555
import java.lang.Runnable
5656
import java.lang.ref.WeakReference
5757
import java.util.*
5858
import java.util.concurrent.ConcurrentHashMap
5959
import java.util.concurrent.CountDownLatch
60-
import java.util.concurrent.LinkedBlockingDeque
6160

6261

6362
private var countDownLatchs : MutableMap<String, CountDownLatch> = ConcurrentHashMap()
@@ -67,7 +66,7 @@ private var keepAliveThreadRuning = true
6766

6867
class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.SurfaceTextureListener,
6968
XP2PCallback, CoroutineScope by MainScope(), VolumeChangeObserver.VolumeChangeListener,
70-
AudioRecordUtilListener {
69+
IMediaPlayer.OnInfoListener {
7170

7271
open var tag = VideoPreviewActivity::class.simpleName
7372
var orientationV = true
@@ -99,6 +98,8 @@ class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.Surface
9998
var screenWidth = 0
10099
var screenHeight = 0
101100
var firstIn = true
101+
@Volatile
102+
var speakAble = false
102103

103104
override fun getContentView(): Int {
104105
return R.layout.activity_video_preview
@@ -171,6 +172,7 @@ class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.Surface
171172
open fun startPlayer() {
172173
if (App.data.accessInfo == null || TextUtils.isEmpty(presenter.getDeviceName())) return
173174
player = IjkMediaPlayer()
175+
player.setOnInfoListener(this)
174176
mHandler.sendEmptyMessageDelayed(MSG_UPDATE_HUD, 500)
175177

176178
Thread(Runnable {
@@ -274,16 +276,19 @@ class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.Surface
274276
if (it.size == 1 && it.get(0).status == 0) {
275277
XP2P.runSendService("${accessInfo.productId}/${presenter.getDeviceName()}", Command.getTwoWayRadio(presenter.getChannel()), true)
276278
audioRecordUtil.start()
279+
speakAble = true
277280
return true
278281
}
279282
}
280283

281284
} else {
285+
speakAble = false
282286
audioRecordUtil.stop()
283287
XP2P.stopSendService("${accessInfo.productId}/${presenter.getDeviceName()}", null)
284288
return true
285289
}
286290
}
291+
speakAble = false
287292
return false
288293
}
289294

@@ -445,6 +450,7 @@ class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.Surface
445450
layout_video_preview?.addView(v_preview, 0)
446451

447452
player = IjkMediaPlayer()
453+
player.setOnInfoListener(this@VideoPreviewActivity)
448454
// player._setApmStatus(true)
449455
player?.let {
450456
val url = urlPrefix + suffix
@@ -738,15 +744,22 @@ class VideoPreviewActivity : VideoBaseActivity(), EventView, TextureView.Surface
738744
tv_video_w_h?.text = "${player.videoWidth} x ${player.videoHeight}"
739745
}
740746

741-
override fun onReadPlayerPcmByte(): ByteArray? {
742-
// val data = ByteArray(10240)
743-
// val len = player._getPcmData(data)
744-
// return if (len > 0) {
745-
// val playerBytes = ByteArray(len)
746-
// System.arraycopy(data, 0, playerBytes, 0, len);
747-
// playerBytes
748-
// } else {
749-
return null
750-
// }
747+
override fun onInfo(mp: IMediaPlayer?, what: Int, extra: Int): Boolean {
748+
return true
749+
}
750+
751+
override fun onInfoSEI(
752+
mp: IMediaPlayer?,
753+
what: Int,
754+
extra: Int,
755+
sei_content: String?
756+
): Boolean {
757+
return false
758+
}
759+
760+
override fun onInfoAudioPcmData(mp: IMediaPlayer?, arrPcm: ByteArray?, length: Int) {
761+
if (audioRecordUtil != null && length > 0 && speakAble) {
762+
audioRecordUtil.setPlayerPcmData(arrPcm);
763+
}
751764
}
752765
}

0 commit comments

Comments
 (0)