2012-01-30 2 views
3

Я использую vlcj для захвата экрана в моей программе Java. Поэтому я использую следующий код:Захват с помощью vlcj дает только поврежденный видеофайл

public static void main(final String[] args) { 
      NativeLibrary.addSearchPath("vlc", "/Applications/VLC.app/Contents/MacOS/lib/"); 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
       new CaptureTest().start("screen://"); 
       } 
      }); 
      } 

public CaptureTest() { 
      factory = new MediaPlayerFactory(); 
      mediaPlayer = (HeadlessMediaPlayer) factory.newMediaPlayer(); 
      } 

      private void start(String mrl) { 

      File dir = new File(System.getProperty("user.home"), "Videos"); 
      dir.mkdirs(); 

      DateFormat df = new SimpleDateFormat("yyyyMMdd-HHmmss"); 
      String fileName = dir.getAbsolutePath() + "/Capture-" + df.format(new Date()) + ".mp4"; 

      String[] options = { 
      ":sout=#transcode{vcodec=h264,acodec=mp4a}:std{mux=mp4,access=file,dst=" + fileName + "}", ":input-slave=screen://" 
      }; 

      mediaPlayer.playMedia(mrl, options); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      mediaPlayer.stop(); 
      mediaPlayer.release(); 
      } 

Проблема заключается в том, что выходной видеофайл составляет всего 4 КБ, и вы не можете его воспроизвести. Может кто-нибудь мне помочь? Я на Mac OS 10.6.8 и я использую VLC 1.1.12 и 1.1.5 vlcj

+0

Вы хотите сделать screencasting с VLC? –

+0

Вы протестировали параметр команды: sout с помощью самой команды VLC, а не Java, чтобы убедиться, что она работает правильно или нет на вашем компьютере? –

+0

Если это не сработает, попробуйте параметр командной строки VLC, указанный в следующей ссылке: http://opensource.about.com/od/tutorials/ss/How-To-Capture-A-Screencast-Using-Vlc_6. htm –

ответ

1

Вот интересная часть кода ...

mediaPlayer.playMedia(mrl, options); 
    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    mediaPlayer.stop(); 
    mediaPlayer.release(); 

Почему вы играете СМИ, спал в течение 5 секунд и немедленно остановился после этого? Возможно, поэтому во время записи экрана вы получаете очень маленький размер файла. Из того, что я заметил, транскод не так быстр, поэтому файл не увеличивается в размерах сразу (возможно, из-за буферизации происходит во время перекодирования, я думаю ...)

Лучше всего создать кнопку каждый для действия воспроизведения/записи и для действия остановки.

+0

нет, это определенно не проблема. Я сам это понял: мне пришлось добавить параметр screen-fps = 5.0 в массив опций. после того, как он работал нормально. – tester

+0

Хм, это действительно так просто? Потому что мне не нужно устанавливать 'screen-fps' вообще для успешной записи экрана рабочего стола через VLCJ в моем примере кода. Когда я запускаю свой код, очевидно, что я показал, что вы не записываете файл должным образом, так как он был прерван слишком рано (выполняется в течение 5 секунд и позже немедленно останавливается). Вот почему файл составляет всего 4 КБ и не играет. Для одного кадра размером 640 х 480 х 32 пикселя он должен, по крайней мере, иметь размер 9 МБ без сжатия. Возможно, вы что-то упустили и заблудились в поиске решения вашей реальной проблемы. – ecle

+0

Исправление: я забыл разделить на 8 ... если несжатый, он должен быть не менее 1 МБ (640 x 480 x 32/8). 32-битный цвет/8 = 4 байта информации раз размер разрешения кадра ... Я не знаю вашего размера рабочего стола в то время, когда вы его записываете..так, я просто предполагаю, что 640 x 480. Но кодек h264 включает в себя сокращение информация о размере кадра из одного состояния кадра в другое, если происходит сжатие. – ecle

0

Вы можете проверить свою цепь. У меня также возникла проблема с генерацией видеофайлов. Рабочая рабочая цепь для меня:

:sout=#transcode{vcodec=mp2v, vb=4096,scale=1, acodec=mpga, ab=128, channels=2, samplerate=44100} 
:duplicate{dst=file{dst="+ fileName+"}, dst=display, select=noaudio}