2013-05-30 4 views
1

Короче говоря, я ищу способ получить поток байтов с камеры во время записи видео. Цель состоит в том, чтобы непрерывно записывать, сохраняя определенные части текущей записи, не останавливая фактический процесс записи для доступа к выходному файлу. Возможно ли это, или мне нужно будет фактически остановить запись и сохранить ее для ее воспроизведения?Доступ к выходному видео во время записи

Я видел проекты и библиотеки с открытым исходным кодом, которые позволяют передавать потоковое видео с камеры на сервер через локальный сокет и класс ParcelFileDescriptor, поэтому я предполагаю (возможно, неправильно), что поток байтов рекордера должен быть каким-то образом доступным.

Любые предложения или помощь были бы весьма полезны.

ответ

0

Установить выходной файл FileDescriptor:

mRecorder.setOutputFile(getStreamFd()); 

Затем использовать эту функцию:

private FileDescriptor getStreamFd() { 
    ParcelFileDescriptor[] pipe = null; 

    try { 
     pipe = ParcelFileDescriptor.createPipe(); 

     new TransferThread(new ParcelFileDescriptor.AutoCloseInputStream(pipe[0]), 
       new FileOutputStream(getOutputFile())).start(); 
    } catch (IOException e) { 
     Log.e(getClass().getSimpleName(), "Exception opening pipe", e); 
    } 

    return (pipe[1].getFileDescriptor()); 
} 

private File getOutputFile() { 
    return (new File(Environment.getExternalStorageDirectory().getPath().toString() + "/YourDirectory/filename")); 
} 

Новый код Тема:

static class TransferThread extends Thread { 
    InputStream in; 
    FileOutputStream out; 

    TransferThread(InputStream in, FileOutputStream out) { 
     this.in = in; 
     this.out = out; 
    } 

    @Override 
    public void run() { 
     byte[] buf = new byte[8192]; 
     int len; 

     try { 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      in.close(); 

      out.flush(); 
      out.getFD().sync(); 
      out.close(); 

     } catch (IOException e) { 
      Log.e(getClass().getSimpleName(), 
        "Exception transferring file", e); 
     } 
    } 
} 

Не забудьте добавить persmissions в манифесте файл:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

используя этот подход, я получаю видео файл, который не может быть воспроизведен. Какие-либо предложения ? –

1

У меня была аналогичная проблема и я хотел записать H264 в файл MP4, обращаясь к потоку байтов блока H264 NAL (перенаправляйте его на libRTMP). Следующий пример помог ALOT (требуется по крайней мере, Android 4.3):

< http://bigflake.com/mediacodec/ - CameraToMpegTest.java и «Android Арканоида записывающего патч» примеры

В основном, андроиды MediaCodec класс обеспечивает низкоуровневый доступ к кодерам устройств/декодеры. Посмотрите на функции drainEncoder() из приведенных выше примеров:

  • видеоданные отправить MediaMuxer создать выходной файл
  • вы можете легко получить доступ единиц H264 NAL из encodedData ByteBuffer и обрабатывать их в как вы хотите

Пример:

int old_pos = encodedData.position(); 
encodedData.position(0); 
byte[] encoded_array = new byte[encodedData.remaining()]; 
encodedData.get(encoded_array); 
encodedData.position(old_pos); 
Смежные вопросы