3636import androidx .localbroadcastmanager .content .LocalBroadcastManager ;
3737
3838import com .alibaba .fastjson .JSON ;
39- //import com.iot.gvoice.interfaces.GvoiceJNIBridge;
4039import com .tencent .iot .explorer .device .android .app .R ;
4140import com .tencent .iot .explorer .device .android .app .utils .CommonUtils ;
4241import com .tencent .iot .explorer .device .common .stateflow .entity .CallingType ;
4948import com .tencent .iot .explorer .device .video .recorder .encoder .AudioEncoder ;
5049import com .tencent .iot .explorer .device .video .recorder .encoder .VideoEncoder ;
5150import com .tencent .iot .explorer .device .video .recorder .listener .OnEncodeListener ;
52- import com .tencent .iot .explorer .device .video .recorder .listener .OnReadAECProcessedPcmListener ;
5351import com .tencent .iot .explorer .device .video .recorder .param .AudioEncodeParam ;
5452import com .tencent .iot .explorer .device .video .recorder .param .MicParam ;
5553import com .tencent .iot .explorer .device .video .recorder .param .VideoEncodeParam ;
7977import static com .tencent .iot .explorer .device .android .utils .ConvertUtils .byte2HexOnlyLatest8 ;
8078import static com .tencent .iot .explorer .device .video .recorder .consts .LogConst .RTC_TAG ;
8179
82- public class RecordVideoActivity extends AppCompatActivity implements TextureView .SurfaceTextureListener , OnEncodeListener , SurfaceHolder .Callback {
80+ public class RecordVideoActivity extends AppCompatActivity implements TextureView .SurfaceTextureListener , OnEncodeListener , SurfaceHolder .Callback ,
81+ IMediaPlayer .OnInfoListener {
8382
8483 private static Timer bitRateTimer ;
8584 private String TAG = RecordVideoActivity .class .getSimpleName ();
@@ -117,14 +116,6 @@ public class RecordVideoActivity extends AppCompatActivity implements TextureVie
117116 private int vh = 240 ;
118117 private int frameRate = 15 ;
119118
120- private LinkedBlockingDeque <Byte > playPcmData = new LinkedBlockingDeque <>(); // 内存队列,用于缓存获取到的播放器音频pcm
121- private String audioCacheFilePath = Environment .getExternalStorageDirectory ().getAbsolutePath ()+ "/audio1_cache_file" ;
122- private Handler writeHandler ;
123- private final int MESSAGE_AUDIO_ENCODE_FROM_BYTE = 3000 ;
124- private FileOutputStream fos1 ;
125- private FileOutputStream fos2 ;
126- private FileOutputStream fos3 ;
127-
128119 @ Override
129120 protected void onCreate (@ Nullable Bundle savedInstanceState ) {
130121 super .onCreate (savedInstanceState );
@@ -187,97 +178,33 @@ private void initAudioEncoder() {
187178 .setAudioFormat (AudioFormat .ENCODING_PCM_16BIT ) // PCM
188179 .build ();
189180 AudioEncodeParam audioEncodeParam = new AudioEncodeParam .Builder ().build ();
190- audioEncoder = new AudioEncoder (micParam , audioEncodeParam , processedPcmListener );
181+ audioEncoder = new AudioEncoder (this , micParam , audioEncodeParam , true , true );
191182 audioEncoder .setOnEncodeListener (this );
192183 }
193184
194- private OnReadAECProcessedPcmListener processedPcmListener = new OnReadAECProcessedPcmListener () {
195- @ Override
196- public byte [] onReadAECProcessedPcmListener (byte [] micPcmBytes ) {
197- // byte[] playerPcmBytes = onReadPlayerPlayPcm(micPcmBytes.length);
198- // byte[] cancell = new byte[micPcmBytes.length];
199- // for (int i = 0; i<4; i++) {
200- // byte[] tempAudioR = new byte[640];
201- // byte[] tempPlayer = new byte[640];
202- // System.arraycopy(micPcmBytes, i*640, tempAudioR, 0, 640);
203- // System.arraycopy(playerPcmBytes, i*640, tempPlayer, 0, 640);
204- // byte[] tempC = GvoiceJNIBridge.cancellation(tempAudioR, tempPlayer);
205- // System.arraycopy(tempC, 0, cancell, i*640, 640);
206- // }
207- //
208- // if (writeHandler != null) {
209- // JSONObject jsonObject = new JSONObject();
210- // try {
211- // jsonObject.put("micBytesData", micPcmBytes);
212- // jsonObject.put("playerBytesData", playerPcmBytes);
213- // jsonObject.put("cancellBytesData", cancell);
214- // } catch (JSONException e) {
215- // e.printStackTrace();
216- // }
217- // Message message = writeHandler.obtainMessage(MESSAGE_AUDIO_ENCODE_FROM_BYTE, jsonObject);
218- // message.arg1 = micPcmBytes.length;
219- // writeHandler.sendMessage(message);
220- // }
221- // return cancell;
222- return micPcmBytes ;
223- }
224-
225- @ Override
226- public void audioCodecRelease () {
227- // GvoiceJNIBridge.destory();
228- // playPcmData.clear();
229- }
230- };
231-
232- private byte [] onReadPlayerPlayPcm (int length ) {
233- if (player != null && player .isPlaying ()) {
234- byte [] data = new byte [204800 ];
235- int len = player ._getPcmData (data );
236- if (playPcmData .size () > 8 *length ) {
237- if (len > 6 *length ) {
238- len = 6 *length ;
239- } else if (len == 0 ) {
240- } else {
241- int temp = playPcmData .size () - (6 *length - len );
242- for (int i = 0 ; i < temp ; i ++) {
243- playPcmData .remove ();
244- }
245- }
246- } else if (len > 8 *length ) {
247- len = 6 *length ;
248- }
249- if (len > 0 ) {
250- byte [] playerBytes = new byte [len ];
251- System .arraycopy (data , 0 , playerBytes , 0 , len );
252- List <Byte > tmpList = new ArrayList <>();
253- for (byte b : playerBytes ){
254- tmpList .add (b );
255- }
256- playPcmData .addAll (tmpList );
257- }
258- if (playPcmData .size () > length ) {
259- byte [] res = new byte [length ];
260- try {
261- for (int i = 0 ; i < length ; i ++) {
262- res [i ] = playPcmData .take ();
263- }
264- } catch (InterruptedException e ) {
265- e .printStackTrace ();
266- }
267- return res ;
268- } else {
269- return new byte [length ];
270- }
271- }
272- return new byte [length ];
273- }
274-
275185 private void initVideoEncoder () {
276186 VideoEncodeParam videoEncodeParam = new VideoEncodeParam .Builder ().setSize (vw , vh ).setFrameRate (frameRate ).setBitRate (vw *vh ).build ();
277187 videoEncoder = new VideoEncoder (videoEncodeParam );
278188 videoEncoder .setEncoderListener (this );
279189 }
280190
191+ @ Override
192+ public boolean onInfo (IMediaPlayer mp , int what , int extra ) {
193+ return false ;
194+ }
195+
196+ @ Override
197+ public boolean onInfoSEI (IMediaPlayer mp , int what , int extra , String sei_content ) {
198+ return false ;
199+ }
200+
201+ @ Override
202+ public void onInfoAudioPcmData (IMediaPlayer mp , byte [] arrPcm , int length ) {
203+ if (audioEncoder != null && length > 0 ) {
204+ audioEncoder .setPlayerPcmData (arrPcm );
205+ }
206+ }
207+
281208
282209 public class AdapterBitRateTask extends TimerTask {
283210 @ Override
@@ -335,11 +262,7 @@ private void startRecord() {
335262 if (phoneInfo .getCallType () == CallingType .TYPE_VIDEO_CALL ) {
336263 startEncodeVideo = true ;
337264 }
338- if (!TextUtils .isEmpty (audioCacheFilePath )) {
339- new WriteThread ().start ();
340- }
341265 audioEncoder .start ();
342- // GvoiceJNIBridge.init();
343266
344267 startBitRateAdapter ();
345268 }
@@ -400,7 +323,6 @@ private void releasePlayer() {
400323 if (player .isPlaying ()) {
401324 player .stop ();
402325 }
403- player ._setApmStatus (false );
404326 player .release ();
405327 }
406328 }
@@ -443,6 +365,7 @@ private void play() {
443365 }
444366 player = new IjkMediaPlayer ();
445367 player .reset ();
368+ player .setOnInfoListener (this );
446369 mHandler .sendEmptyMessageDelayed (MSG_UPDATE_HUD , 500 );
447370 /*
448371 * probesize & analyzeduration 可通过这两个参数进行首开延时优化
@@ -470,7 +393,6 @@ private void play() {
470393 player .setMaxPacketNum (2 );
471394 player .setSurface (this .surface );
472395 player .setAndroidIOCallback (ReadByteIO .Companion .getInstance ());
473- player ._setApmStatus (true );
474396 player .setOnErrorListener (new IMediaPlayer .OnErrorListener () {
475397 @ Override
476398 public boolean onError (IMediaPlayer mp , int what , int extra ) {
@@ -725,70 +647,4 @@ private String getSendStreamStatus() {
725647 return "Unkown" ;
726648 }
727649
728- class WriteThread extends Thread {
729- @ SuppressLint ("HandlerLeak" )
730- @ Override
731- public void run () {
732- super .run ();
733- Looper .prepare ();
734- File file1 = new File (audioCacheFilePath +"_file1.pcm" );
735- File file2 = new File (audioCacheFilePath +"_file2.pcm" );
736- File file3 = new File (audioCacheFilePath +"_file3.pcm" );
737- Log .i (TAG , "audio cache pcm file path:" + audioCacheFilePath );
738- if (file1 .exists ()) {
739- file1 .delete ();
740- }
741- if (file2 .exists ()) {
742- file2 .delete ();
743- }
744- if (file3 .exists ()) {
745- file3 .delete ();
746- }
747- try {
748- file1 .createNewFile ();
749- file2 .createNewFile ();
750- file3 .createNewFile ();
751- } catch (IOException e ) {
752- e .printStackTrace ();
753- }
754- try {
755- fos1 = new FileOutputStream (file1 );
756- fos2 = new FileOutputStream (file2 );
757- fos3 = new FileOutputStream (file3 );
758- } catch (FileNotFoundException e ) {
759- e .printStackTrace ();
760- Log .e (TAG , "临时缓存文件未找到" );
761- }
762- writeHandler = new Handler () {
763- @ Override
764- public void handleMessage (Message msg ) {
765- super .handleMessage (msg );
766- if (msg .what == MESSAGE_AUDIO_ENCODE_FROM_BYTE ) {
767- JSONObject jsonObject = (JSONObject ) msg .obj ;
768- if (AudioRecord .ERROR_INVALID_OPERATION != msg .arg1 ) {
769- if (fos1 != null && fos2 != null && fos3 != null ) {
770- try {
771- byte [] micBytesData = (byte []) jsonObject .get ("micBytesData" );
772- byte [] playerBytesData = (byte []) jsonObject .get ("playerBytesData" );
773- byte [] cancellBytesData = (byte []) jsonObject .get ("cancellBytesData" );
774- fos1 .write (micBytesData );
775- fos1 .flush ();
776- fos2 .write (playerBytesData );
777- fos2 .flush ();
778- fos3 .write (cancellBytesData );
779- fos3 .flush ();
780- } catch (IOException e ) {
781- e .printStackTrace ();
782- } catch (JSONException e ) {
783- e .printStackTrace ();
784- }
785- }
786- }
787- }
788- }
789- };
790- Looper .loop ();
791- }
792- }
793-
794650}
0 commit comments