ВидеокамераProfile.QUALITY_HIGH обеспечивает зеленое мерцающее видео

До сих пор я не нашел объяснений. В основном у меня есть класс видеозаписи, который отлично работает, когда setVideoSize () установлен на 720 x 480 на моем Samsung Galaxy S2.

Я хочу, чтобы он записывался с максимально возможным разрешением, поэтому с помощью CamcorderProfile.QUALITY_HIGH Я могу получить различные свойства записи высокого качества и установить их в своем классе. Это работает для формата файла, частоты кадров видео, кодеров и скорости передачи данных, однако, когда я пытаюсь установить размер видео на ширину и высоту, возвращаемые CamcorderProfile (1920 x 1080), записанное видео просто зеленое мерцание.

Я заметил, что если сменить 720 х 480 на 720 х 481, то он сделал то же самое. Поэтому я могу только предположить, что это происходит, когда разрешение не поддерживается телефоном. Тем не менее, видеокамера, к которой пришел телефон, может записываться в 1920 x 1080 и обеспечивает отличную запись.

Я могу предположить только с таким высоким разрешением. Мне нужно установить другие параметры по-разному, но я просто не могу понять, какими они могут быть.

У кого еще возникла эта проблема?

Заранее благодарим за любые ответы.

Solutions Collecting From Web of "ВидеокамераProfile.QUALITY_HIGH обеспечивает зеленое мерцающее видео"

Я столкнулся с этим вопросом, пытаясь решить ту же проблему.

Решение передается разработчику xda http://forum.xda-developers.com/showthread.php?t=1104970&page=8 . Кажется, вам нужно установить неясный параметр «cam_mode» для записи высокой четкости:

camera = Camera.open(); Camera.Parameters param = camera.getParameters(); param.set( "cam_mode", 1 ); camera.setParameters( param ); 

В mediarecorder вы можете использовать

 mediarecorder.setVideoSize(1920, 1080); 

Хотя теперь это также будет работать:

 mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); 

(Последний, кажется, имеет битрейт видео со скоростью 20 Мбит / с, поэтому вам может потребоваться немного уменьшить это!) Я обнаружил, что мне не нужно устанавливать размер предварительного просмотра до 1920×1080.

(Редактировать) Вам также необходимо установить

 parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 

или

 param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); 

В противном случае вы получите задержку за несколько секунд до запуска камеры!

Что касается того, почему Samsung внедрил Camera таким образом, я понятия не имею. Это, безусловно, не для разработчиков!

Вот как мне удалось сделать эту работу на Samsung Galaxy S2. Критическая точка здесь заключается в том, чтобы установить такое же разрешение как в параметрах камеры, так и в размере видеорекордера. Кроме того, уже упоминался взлом «cam_mode». Таким образом, я разрешил пользователю выбирать один из трех режимов качества: низкий (800×480), средний (1280×720) и высокий (1920×1080):

 enum InternalCameraQuality { LOW, MEDIUM, HIGH } 

И при создании / заполнении камеры и рекордера я сделал

 // signature types are irrelevant here File start(DeviceHandler handler, FileHelper fh) throws IOException { file = fh.createTempFile(".mp4"); camera = Camera.open(); setCameraParameters(camera); camera.setPreviewDisplay(getHolder()); camera.unlock(); recorder = new MediaRecorder(); recorder.setCamera(camera); setRecorderParameters(recorder); recorder.prepare(); recorder.start(); return file; } void setCameraParameters(Camera camera) { Camera.Parameters param = camera.getParameters(); // getParams() simply returns some field holding configuration parameters // only the 'quality' parameter is relevant here if (getParams().quality != InternalCameraQuality.LOW) { // Samsung Galaxy hack for HD video param.set("cam_mode", 1); } Pair<Integer, Integer> resolution = getResolution(getParams().quality); param.setPreviewSize(resolution.first, resolution.second); param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY); camera.setParameters(param); } void setRecorderParameters(MediaRecorder recorder) { recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); Pair<Integer, Integer> resolution = getResolution(getParams().quality); CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); profile.videoFrameWidth = resolution.first; profile.videoFrameHeight = resolution.second; recorder.setProfile(profile); recorder.setOutputFile(file.getAbsolutePath()); recorder.setPreviewDisplay(getHolder().getSurface()); } Pair<Integer, Integer> getResolution(InternalCameraQuality quality) { final int width, height; switch (quality) { case LOW: width = 800; height = 480; break; case MEDIUM: width = 1280; height = 720; break; case HIGH: width = 1920; height = 1080; break; default: throw new IllegalArgumentException("Unknown quality: " + quality.name()); } return Pair.create(width, height); } 

Обратите внимание, что вы должны использовать взлом «cam_mode» только для среднего и высокого качества, иначе зеленое мерцание появится в режиме низкого качества. Также, возможно, вы захотите настроить другие параметры профиля.

Надеюсь, это помогло.

В прошлом я сталкивался с подобными проблемами. Что вы делаете, кажется, все в порядке, но вот несколько советов, которые могут помочь отладить проблему:

Убедитесь, что вы выбрали поддерживаемое разрешение

 int cameraId = 0; // using back facing camera Camera camera = Camera.open(cameraId); Camera.Parameters cameraParams = camera.getParameters(); List<Camera.Size> supportedPreviewSizes = cameraParams.getSupportedPreviewSizez(); // find suitable Camera preview size from list and set your CamcorderProfile to use that new size 

После того, как вы разместите подходящий размер предварительного просмотра, обязательно верните SurfaceView – вам нужно будет изменить его размер, чтобы вносить изменения в соотношение сторон

API MediaRecorder использует SurfaceView, поэтому, если ваш поверхностный вид не настроен правильно, это приведет к появлению зеленого фликкера, который вы видите

Убедитесь, что вы используете скорость передачи видео, которая может поддерживать новое разрешение, – попробуйте бить битовую скорость видео, чтобы удвоить то, что было изначально установлено (обратите внимание, что это резко влияет на размер вашего выходного файла)

CamcorderProfile.QUALITY_HIGH возвращает максимально возможное разрешение камеры. Убедитесь, что вы используете правильный идентификатор камеры (спереди и сзади) – возможно, камера заднего вида поддерживает 1080p, но камера переднего фронта не работает?

Надеюсь, советы помогут!

  List<Size> ls = parameters.getSupportedPreviewSizes(); Size size = ls.get(1); sizes 1 ----------960 720 sizes 2 ----------800 480 sizes 3 ----------720 480 sizes 5 -----------640 384 sizes 6 ----------576 432 sizes 7 ----------480 320 

Это список размеров и многое другое в android.

Хорошо, я проверил множество вариантов и единственную версию, которая хорошо работает на реальных устройствах:

 CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); // THREE_GPP works well but only on Phones // camcorderProfile.fileFormat = MediaRecorder.OutputFormat.THREE_GPP; // so better you use MPEG_4 for most Devices and PC camcorderProfile.fileFormat = MediaRecorder.OutputFormat.MPEG_4; camcorderProfile.videoCodec = MediaRecorder.VideoEncoder.MPEG_4_SP; mrec.setProfile(camcorderProfile);