2013-01-03 34 views
26

我試圖讓用戶錄製視頻是不同的尺寸比實際的屏幕預覽,他們可以看到在錄製錄製視頻。這似乎可以從this documentation concerning the getSupportedVideoSizes function其中規定:用不同的預覽大小比生成的視頻文件

如果返回的列表不爲空,則返回的列表將包含在 至少一個的大小和尺寸之一返回列表中必須 傳遞給MediaRecorder。攝像機應用程序的setVideoSize()如果使用 攝像機作爲視頻源。 在這種情況下, 預覽的大小可能與視頻錄製過程中錄製的視頻 的分辨率不同。

這表明,一些手機將返回null從這個FN(在我的經驗銀河SIII一樣),但對於那些誰不這樣做,就可以提供預覽具有不同分辨率比實際的視頻。這種理解是否正確?有些手機允許行爲,而其他手機不行?

嘗試一個解決方案:

official description of the setPreviewDisplay功能,這是在lengthy process of setting up for video recording使用時,需提到的是:

如果此方法被稱爲具有空表面或完全不叫,媒體 錄像機不會更改相機的預覽表面。

這似乎是我想要的,但不幸的是,如果我這樣做,整個視頻錄製過程是完全搞砸了。我假設這個函數在錄製視頻的過程中不能傳遞null或者根本沒有被調用。也許在其他情況下,這是好的。不幸的是,這似乎並沒有幫助我。

我接下來的步驟是查看TextureView s,並使用預覽紋理而不是典型的SurfaceView實現,以便使用openGL將紋理拉伸到與實際分辨率不同的所需大小(並裁剪任何超出屏幕),然後用Surface(SurfaceTexture surfaceTexture)構造函數爲Surface創建setPreviewDisplay函數的曲面。由於ICS下面的不兼容性,我想避免使用TextureView,並且還因爲這增加了很大的複雜性。

這似乎是一個微妙的過程,但我希望有人能在這方面提供一些建議。

謝謝。

+0

你能澄清一下「完全搞砸」的含義嗎? –

+0

如果我沒有記錯,這意味着預覽表面變黑,沒有任何記錄。 –

回答

1

a.Assume用戶設置x的大小,Y視頻大小

b.Now與getSupportedVideoSizes功能得到整個列表,看看是否X,Y落在其中的一個,並設置MediaRecorder.setVideoSize ()。如果x,y不落入getSupportedVideoSizes列表中,則設置視頻記錄的默認配置文件。

這是關於視頻的大小

現在來預覽大小,沒有太多的解決辦法的選擇。 拿一個包含SurfaceView的RelativeLayout。

<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/preview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
/> 

預覽是SurfaceView的名稱。 在這裏,我給了一個重新調整大小的寬度和高度的一半樣本。

resetCamera(); //reset the camera 

ViewGroup.LayoutParams params = preview.getLayoutParams(); 
RelativeLayout myRelLayout = (RelativeLayout) findViewById(R.id.myRelLayout); 
params.width = (int) (myRelLayout.getWidth()/2); 
params.height = (int)(myRelLayout.getHeight()/2); 
preview.setLayoutParams(params); 

initCamera(); //initiate the camera(open camera, set parameter, setPreviewDisplay,startPreview) 

請看預覽的分辨率,然後根據視頻大小相應地縮小高度或寬度。

希望它有幫助。

1

正如你所提到的,這隻有在getSupportedVideoSizes()返回一個非空列表時纔有可能。

但是,如果你看到一個非空列表,那麼這個簡單的方法應該工作:

  1. 設置所需的預覽分辨率setPreviewSize;您選擇的尺寸必須是從getSupportedPreviewSizes給出的尺寸之一。

  2. 分別使用setPreviewDisplaysetPreviewTexture將預覽顯示設置爲您的SurfaceView或SurfaceTexture。

  3. 開始預覽。

  4. 創建媒體記錄器,並使用了大小的一個從getSupportedVideoSizes直接與setVideoSize設置其視頻的大小,或使用預定義的Camcorder profiles之一,對於給定的質量/尺寸配置所有媒體記錄器設置。

  5. 將相機對象傳遞給MediaRecorder的setCamera調用,配置媒體記錄器的其餘部分並開始記錄。

在一個非空getSupportedVideoSizes列表中的設備,這將導致預覽住在你的setPreviewSize調用設置的分辨率,與記錄在設定的視頻尺寸/攝像機輪廓的分辨率運行。在沒有支持的視頻尺寸的設備上,預覽尺寸將由MediaRecorder重置以匹配錄製尺寸。您應該可以通過設置非常低的預覽分辨率和高錄製分辨率(例如,160x120用於預覽,720p用於錄製)來測試此功能。如果MediaRecorder在錄製開始時將預覽分辨率切換到720p應該很明顯,因爲預覽質量會大幅度提高。

請注意,預覽大小不直接鏈接到顯示SurfaceView的尺寸;相機預覽的輸出將被縮放以適合SurfaceView,因此,如果SurfaceView的尺寸(比如佈局和設備)的尺寸爲100x100像素,則無論您使用的預覽分辨率如何,都將縮放爲100x100以供顯示。因此,您仍然需要確保SurfaceView的縱橫比保持正確,以便預覽不會失真。

爲了節能,您不應該使用比SurfaceView中的實際像素數量高得多的預覽分辨率,因爲在適配Surfaceview中的預覽時會損失額外的分辨率。當然,只有當getSupportedVideoSizes()返回一個非空值時纔可以進行記錄。

+0

我會盡快嘗試這一點,但我目前正處於很多代碼檢修過程中,不想惹太多事情。這看起來非常有前途(儘管getSupportedVideoSizes'通常是空的,但是令人沮喪。 –

0

首先,我會試着回答你的具體問題。

  1. 可以使用與實際視頻不同的分辨率提供預覽。這種理解是否正確?

是的,預覽大小通常與記錄大小不同。預覽大小通常與您的顯示大小相關聯。因此,如果手機顯示CIF(352 x 288),但可以錄製D1(720 x 480),則預覽尺寸和錄製尺寸將有所不同。我覺得其他專家在這一點上已經充分回答了。

  1. 做一些手機允許的行爲和其他人不?

大多數最新的手機都支持此功能,除了少數幾款低端手機。

隨着setPreviewDisplay,我們也必須考慮這一點:

的一個例外是,如果預覽面未設置(或設置爲null)startPreview()被調用之前,那麼這種方法可能是用非空參數調用一次來設置預覽表面。 (這允許相機設置和表面創建並行發生,從而節省時間。)預覽運行時,預覽表面可能不會改變。

setPreviewDisplayNULL表面調用時,能否請您分享您面臨的問題?