2016-03-04 114 views
2

我使用Camera2 API使用的兩個例子,你可以在這裏找到幫助:的Android Camera2畫面是黑白的視頻只記錄1秒

我使用相同的源代碼就像上面的鏈接,所以我不會在這裏複製我的源代碼(除非你需要一些部分,我會編輯我的問題併發布它)。

編輯:

了一些測試。當我嘗試通過手機播放視頻時,它只顯示第一幀,我可以聽到實際上正在錄製的音頻(聲音)。一旦視頻一直播放到最後,視頻會以某種方式自動重新啓動並按照其應該顯示的視頻。

但是,當我嘗試在PC上播放視頻時(從手機複製到桌面),我只能看到黑屏直到最後一幀。顯示最後一幀,但視頻根本不播放。我可以聽到音頻(聲音)。

我想也許有一些視頻編碼/解碼的問題?

問題:

在我的情況下,視頻記錄將無法正常工作。我 可以在目錄中看到他們應該在我的手機上, ,但當我播放視頻 (5秒視頻)前4秒是黑色,然後最後一秒是像 一幀我記錄就是這樣,但文件大小似乎很大(160MB)。

屏幕:

  • 將發佈的視頻上傳一次

我不知道什麼是錯的,有人可以請幫助?

+0

我管理糾正我的一些錯誤的照片拍攝。但是,我現在導入了Sample for Camera2Video示例,問題相同。所以在Camera2Video的源代碼示例中可能有些問題。我會試着找出什麼。 –

+0

嘿!你是否一次性使用基本和視頻?我有問題在同一個片段中使用。我不會在單個視圖中用戶可以拍攝照片或錄製視頻。你能幫忙嗎? –

回答

4

這不是一個真正的解決方案,但它仍然做了我想做的伎倆。

爲了播放視頻我不得不禁用音頻完全我MediaRecorder設置:

 //mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setOutputFile(getVideoFile(activity).getAbsolutePath()); 
     mMediaRecorder.setVideoEncodingBitRate(10000000); 
     mMediaRecorder.setVideoFrameRate(24); 
     mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight()); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
     //mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

你可以看到,我可以註釋掉的命令。一旦我做到了,視頻就能正常播放。

希望這個不好解決方法仍然會幫助在錄像中不需要音頻的人。

+0

我有一個相同的問題。我認爲這是硬件相關的;我在Galaxy S7上遇到問題,但在我的Nexus平板電腦上沒有問題。分析視頻文件我發現幀速率和最小幀率是0 fps,即使我將幀速率設置爲30. Android camera2 api galaxy s7 – user3561494

1

在某些設備上,特別是Galaxy系列,S7等,媒體記錄器給視頻軌道提供了不好的時間戳。這會導致音頻先播放,然後播放視頻。要解決此問題,您需要重新分析媒體錄製器生成的輸出並重寫視頻時間戳,從時間0開始。這將修復您在上面發佈的音頻視頻同步問題。

+0

請給出一些關於如何重新分析輸出的建議。 – user3561494

1

三星Galaxy S7(和S6我認爲)有一個編碼錯誤。 解決方法是使用下面的函數重新編碼。

請注意,您需要在此的gradle依賴性: 編譯 'com.googlecode.mp4parser:isoparser:1.1.22'

public void fixSamsungBug() 
{ 
    DataSource channel = null; 
    try 
    { 
     channel = new FileDataSourceImpl(app.dataMgr.videoFileURL); 
    } catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 

    IsoFile isoFile = null; 

    try 
    { 
     isoFile = new IsoFile(channel); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    List<TrackBox> trackBoxes = isoFile.getMovieBox().getBoxes(TrackBox.class); 
    boolean sampleError = false; 
    for (TrackBox trackBox : trackBoxes) { 
     TimeToSampleBox.Entry firstEntry = trackBox.getMediaBox().getMediaInformationBox().getSampleTableBox().getTimeToSampleBox().getEntries().get(0); 

     // Detect if first sample is a problem and fix it in isoFile 
     // This is a hack. The audio deltas are 1024 for my files, and video deltas about 3000 
     // 10000 seems sufficient since for 30 fps the normal delta is about 3000 
     if(firstEntry.getDelta() > 10000) { 
      sampleError = true; 
      firstEntry.setDelta(3000); 
     } 
    } 

    if(sampleError) { 
     Log.d("gpinterviewandroid", "Sample error! correcting..."); 
     Movie movie = new Movie(); 
     for (TrackBox trackBox : trackBoxes) { 
      movie.addTrack(new Mp4TrackImpl(channel.toString() + "[" + trackBox.getTrackHeaderBox().getTrackId() + "]" , trackBox)); 
     } 
     movie.setMatrix(isoFile.getMovieBox().getMovieHeaderBox().getMatrix()); 
     Container out = new DefaultMp4Builder().build(movie); 

     //delete file first! 
     File file = new File(app.dataMgr.videoFileURL); 
     boolean deleted = file.delete(); 


     FileChannel fc = null; 
     try 
     { 
      //fc = new FileOutputStream(new File(app.dataMgr.videoFileURL)).getChannel(); 
      fc = new RandomAccessFile(app.dataMgr.videoFileURL, "rw").getChannel(); 
     } catch (FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 

     try 
     { 
      out.writeContainer(fc); 
      fc.close(); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     Log.d("gpinterviewandroid", "Finished correcting raw video"); 
    } 
} 
+0

那沒有修復我的視頻,你確定這有效嗎?謝謝 –

+0

問題是這段代碼正在改變我的元數據。它是MPEG 4,現在該文件似乎已損壞。任何解決方案 –

-1

此代碼的工作對我來說:

mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
+0

這不提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/17910725) – GoodSp33d