13

मैं Truiton ScreenCapture उदाहरण परती, क्रम में MediaProjectionस्ट्रीम एंड्रॉयड स्क्रीन

का उपयोग करते समय रिकॉर्डिंग की बचत डिवाइस स्क्रीन रिकॉर्ड करने के लिए कोशिश कर रहा हूँ localy यह काम करता है

mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

    String localFilePath = getLocalFilePath(); 
    mMediaRecorder.setOutputFile(localFilePath); 

    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT); 
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    mMediaRecorder.setVideoFrameRate(30); 
    mMediaRecorder.prepare(); 

यह कैसे कभी जब FileDescriptor के साथ काम करने को बदलने नहीं

mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 

    String hostname = "10.26.100.18"; 
    int port = 2007; 
    Socket socket = new Socket(InetAddress.getByName(hostname), port); 
    ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.fromSocket(socket); 
    LocalServerSocket localServerSocket = new LocalServerSocket(fileDescriptor.getFileDescriptor()); 

    mMediaRecorder.setOutputFile(localServerSocket.getFileDescriptor()); 

    mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT); 
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
    mMediaRecorder.setVideoFrameRate(30); 
    mMediaRecorder.prepare(); 

LocalServerSocket, तो mMediaRecorder.prepare() फेंक अपवाद का उपयोग नहीं करते हैं, तो अब मैं हमें हूं कि यह ing, अपवाद

Caused by: java.lang.IllegalStateException: failed to get surface 
    at android.media.MediaRecorder.getSurface(Native Method) 
    at com.truiton.screencapture.MainActivity$override.createVirtualDisplay(MainActivity.java:172) 
    at com.truiton.screencapture.MainActivity$override.onActivityResult(MainActivity.java:133) 
    at com.truiton.screencapture.MainActivity$override.access$dispatch(MainActivity.java) 
    at com.truiton.screencapture.MainActivity.onActivityResult(MainActivity.java:0) 
    at android.app.Activity.dispatchActivityResult(Activity.java:6456) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)  
    at android.app.ActivityThread.-wrap16(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

mMediaRecorder.getSurface()

private VirtualDisplay createVirtualDisplay() { 
    return mMediaProjection.createVirtualDisplay("MainActivity", 
      DISPLAY_WIDTH, DISPLAY_HEIGHT, mScreenDensity, 
      DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, 
      mMediaRecorder.getSurface(), null /*Callbacks*/, null 
      /*Handler*/); 
} 

में नीचे दी गई विधि में अपवाद यह मेरा जावा सर्वर, मैं के बाद mMediaRecorder.prepare() कहा जाता है और के रूप में eccpected यह inputStream.read पर अटक सॉकेट मिलता है। एंड्रॉयड happands में अपवाद है जब मैं फोन mMediaRecorder.start()

final byte[] buffer = new byte[1024]; 
    try { 
     ServerSocket serverSocket = new ServerSocket(2007); 
     while (!serverSocket.isClosed()) { 
      Socket socket = serverSocket.accept(); 
      File videoFile = createEmptyVideoFile(); 
      FileOutputStream outputStream = new FileOutputStream(videoFile); 
      InputStream inputStream = socket.getInputStream(); 
      int length = inputStream.read(buffer); 
      while (length != -1) { 
       outputStream.write(buffer, 0, length); 
       length = inputStream.read(buffer); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

उत्तर

7

आप LocalServerSocket उपयोग करने के लिए नीचे दिए गए क्या आंशिक रूप से मेरे लिए काम किया है, मैं एक MediaStreamer वर्ग जो MediaRecorder फैली है।

public class MediaStreamer extends MediaRecorder { 

    private LocalServerSocket localServerSocket = null; 
    private LocalSocket receiver, sender = null; 

    public void prepare() throws IllegalStateException,IOException { 

     receiver = new LocalSocket(); 
     try { 
      localServerSocket = new LocalServerSocket("<your_socket_addr>"); 
      receiver.connect(new LocalSocketAddress("<your_socket_addr>")); 
      receiver.setReceiveBufferSize(4096); 
      receiver.setSendBufferSize(4096); 
      sender = localServerSocket.accept(); 
      sender.setReceiveBufferSize(4096); 
      sender.setSendBufferSize(4096); 
     } catch (IOException e1) { 
      throw new IOException("Can't create local socket !"); 
     } 

     setOutputFile(sender.getFileDescriptor()); 

     try { 
      super.prepare(); 
     } catch (Exception e) { 
      closeSockets(); 
      throw e; 
     }   
    } 

    public InputStream getInputStream() { 

     InputStream out = null; 

     try { 
      out = receiver.getInputStream(); 
     } catch (IOException e) { 
     } 

     return out; 

    } 


    public void stop() { 
     closeSockets(); 
     super.stop(); 
    } 

    private void closeSockets() { 
     if (localServerSocket !=null) { 
      try { 
       localServerSocket.close(); 
       sender.close(); 
       receiver.close(); 
      } 
      catch (IOException e) { 

      } 
      localServerSocket = null; 
      sender = null; 
      receiver = null; 
     } 
    } 
} 

रिकॉर्डिंग लिए

video = new MediaStreamer(); 
video.reset(); 

video.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
video.setPreviewDisplay(holder.getSurface()); 
video.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
video.setVideoFrameRate(VideoConstants.frameRate); 
video.setVideoEncodingBitRate(VideoConstants.bitRate*1000); 
video.setVideoSize(VideoConstants.resolationX, VideoConstants.resolationY); 
video.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 

try { 
    video.prepare(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
video.start(); 


लेकिन मुख्य समस्या यह है mp4 है स्ट्रीम करने के लिए बहुत आसान नहीं है। मूल समस्या यह है कि MP4 लाइव, स्ट्रीम करने योग्य प्रारूप नहीं है, भले ही डेटा सॉकेट के माध्यम से कैप्चर किया गया हो, फिर भी महत्वपूर्ण फ़ाइल शीर्षलेख जो आमतौर पर ऑडियो या वीडियो कैप्चर के समापन पर लिखे जाते हैं, गायब हैं (क्योंकि सॉकेट की तलाश नहीं है स्थानीय फाइलें) - इसलिए अप्रत्याशित डेटा (और इसलिए, स्थानीय फाइलों के रूप में सहेजे जाने पर यह ठीक काम क्यों करता है, समझ में आता है)।

फ़ाइल शीर्षलेख मैन्युअल रूप से जोड़ने के लिए डेटा पर पोस्ट-प्रोसेसिंग करने का कोई आसान तरीका नहीं है। तो समाधान या तो MP4 को रिकॉर्डिंग प्रारूप के रूप में उपयोग नहीं करता है, या Spydroid प्रोजेक्ट

आशा करता है कि यह मदद करता है के समान पैकेटिसर लिखें।

+0

क्या मेरा उत्तर पर्याप्त नहीं है या कोई और स्पष्टीकरण आवश्यक है, कृपया मुझे बताएं? –

+0

nodejs में 'your_socket_addr' कैसे ढूंढें - easyRTC आर्किटेक्चर? –

संबंधित मुद्दे