0

Ich kämpfe mit diesem ruhigen lange und ich entschied, dass ich Hilfe brauche. Die Grundidee ist hier beschrieben: LinkAndroid: Video-Streaming mit Mediarecorder über Sockets mit ParcelFileDescriptor

Ich möchte die Ausgabe von der MediaRecorder direkt auf meinem Server über Sockets während der Aufnahme streamen. (In diesem speziellen Fall möchte ich sehen, ob dies ohne Verwendung eines Streaming-Protokolls nur über einen HTTP-POST möglich ist.)

Der Fehler meines aktuellen Ansatzes ist: E/MediaRecorder: Start fehlgeschlagen: -2147483648 - RuntimeException

Bevor ich hatte einen Fehler zu diesem Thema zeigt mir mediarecorder-issue-on-lollipop

ich eine AsyncTask Klasse verwenden, um meine record() aufrufen Funktion:

new sendAsync().execute("test"); 


private void recordData(Socket socket){ 
    try{ 
     OutputStream out = socket.getOutputStream(); 
     InputStream is = null; 

     ParcelFileDescriptor[] parcelFileDescriptors = ParcelFileDescriptor.createPipe(); 
     parcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]); 
     parcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]); 
     try{ 
      is = new ParcelFileDescriptor.AutoCloseInputStream(parcelRead); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     //pfd = ParcelFileDescriptor.fromSocket(socket); 
     sft = new SurfaceTexture(0); 
     sf = new Surface(sft); 

     if(recorder == null) { 
      recorder = new MediaRecorder(); 
      recorder.reset(); 
      recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
      recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
      recorder.setVideoFrameRate(30); 
      recorder.setPreviewDisplay(sf); 

      recorder.setOutputFile(parcelWrite.getFileDescriptor()); 

      recorder.setMaxDuration(10000); // 10 seconds 
      try { 
       recorder.prepare(); 
       recorder.start(); 
       System.out.println("This is Recorder running"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      byte[] buffer = new byte[16384]; 
      int byteread = 0; 
      while ((byteread = is.read(buffer, 0, buffer.length)) != -1) { 
       out.write(buffer, 0, byteread); 
      } 
      out.flush(); 
     }else{ 
      stopRecording(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Sorry für t er hat einen schlechten Programmierstil.

Ich habe versucht, das OutputFormat und VideoEncoder nach anderen Lösungen zu dem Thema zu ändern. Aber ich bin mir immer noch nicht sicher, ob ich in die richtige Richtung gehe.

Auch nachdem ich diesen Fehler entdeckt habe, denke ich, dass ich den Stream irgendwie auslesen und an den Server in seinem eigenen Thread senden muss.

Jeder Hinweis könnte helfen.

Antwort

0

Ich bin nicht sicher, ob dies ein Fehler aufgrund der neuesten Versionen auf Android (getestet auf Nougat und Oreo) ist. Aber so sehr ich versuchte, eine Problemumgehung zu finden, endete ich immer noch mit der gleichen Fehlermeldung beim Versuch, den MediaRecorder zu verwenden. Dank Libstreaming verwende ich jetzt die MediaCodec API in ihrem Beispiel erklärt, wie man die Bibliothek verwendet: Example 2.

Dann nehme ich den Inputstream der MediaCodec-API und lese ihn in ein Byte-Array, bis eine bestimmte Größe erreicht ist und sende dies an meinen http-Server.

Verwandte Themen