CamcorderProfile.Wysokiej jakości wysokiej rozdzielczości produkuje zielony migotanie wideo

Jak dotąd nie znalazłem na to żadnego wyjaśnienia. Zasadniczo mam klasę nagrywania wideo, która działa wspaniale, gdy setVideoSize() jest ustawiony na 720 x 480 na moim Samsungu Galaxy S2.

Chcę, aby nagrywał w najwyższej możliwej rozdzielczości, więc za pomocą CamcorderProfile.QUALITY_HIGH mogę uzyskać różne właściwości nagrywania najwyższej jakości i ustawić je w mojej klasie. Działa to dla formatu pliku, szybkości klatek wideo, koderów i przepływności, jednak gdy próbuję ustawić rozmiar wideo na szerokość i wysokość zwracana przez Kamkorderprofile (1920 x 1080), nagrany film jest tylko zielonym migotaniem.

Zauważyłem, że jak zmieniłem 720 x 480 na 720 x 481 to zrobił to samo. Dlatego mogę założyć, że dzieje się tak tylko wtedy, gdy rozdzielczość nie jest obsługiwana przez telefon. Jednak Kamera, z którą przyszedł telefon, może nagrywać w rozdzielczości 1920 x 1080 i zapewnia doskonałe nagrywanie.

Mogę tylko założyć, że przy tak wysokiej rozdzielczości muszę ustawić inne parametry inaczej, ale nie wiem, co to może być.

Czy ktoś jeszcze miał ten problem?

Z góry dzięki za wszelkie odpowiedzi.

Author: William Stewart, 2011-08-29

5 answers

Natknąłem się na to pytanie próbując rozwiązać ten sam problem.

A solution is given over on XDA developer http://forum.xda-developers.com/showthread.php?t=1104970&page=8. wydaje się, że musisz ustawić niejasny parametr "cam_mode", aby nagrywanie w wysokiej rozdzielczości działało:

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

W mediarecorder możesz użyć

mediarecorder.setVideoSize(1920, 1080);

Chociaż teraz to również zadziała:

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

(ta ostatnia wydaje się mieć bitrate wideo 20Mb / s, więc możesz chcieć Zdejmij to trochę!) Stwierdziłem, że nie muszę ustawiać rozmiaru podglądu na 1920x1080.

(edit) musisz też ustawić

parame.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

Lub

param.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);

W przeciwnym razie masz opóźnienie o kilka sekund przed uruchomieniem kamery!

Co do tego, dlaczego Samsung zaimplementował aparat w ten sposób, nie mam pojęcia. Na pewno nie jest przyjazny dla deweloperów!

 19
Author: SGS2camera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 08:29:11

Oto jak udało mi się to zrobić na Samsungu Galaxy S2. Punktem krytycznym jest ustawienie tej samej rozdzielczości zarówno w parametrach kamery, jak i rozmiarze wideo rejestratora. Wymagany jest również wspomniany już hack 'cam_mode'. Tak więc pozwoliłem użytkownikowi wybrać jeden z trzech trybów jakości: niski( 800x480), średni(1280x720) i wysoki(1920x1080):

enum InternalCameraQuality {
    LOW, MEDIUM, HIGH
}

I podczas tworzenia / wypełniania aparatu i rejestratora zrobiłem

// 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);
}

Zauważ, że musisz używać' cam_mode ' hack tylko dla średnich i wysokich jakość, w przeciwnym razie zielone migotanie pojawi się w trybie niskiej jakości. W razie potrzeby możesz również dostosować inne Ustawienia profilu.

Nadzieja, to pomogło.
 8
Author: Tvaroh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-12 12:40:18
        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

Oto lista rozmiarów i więcej w Androidzie.

 1
Author: user1628121,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-06 06:17:24

Ok, przetestowałem wiele wariantów i jedyną wersją, która działa dobrze na prawdziwych urządzeniach jest:

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);
 1
Author: Ingo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 20:14:49

W przeszłości doświadczyłem podobnych problemów. To, co robisz, wydaje się być w porządku, ale oto kilka sugestii, które mogą pomóc w debugowaniu problemu: {]}

Upewnij się, że wybierasz obsługiwaną rozdzielczość

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

Po znalezieniu odpowiedniego rozmiaru podglądu pamiętaj, aby zresetować Widok SurfaceView - będziesz musiał zmienić jego rozmiar, aby dostosować go do zmiany proporcji

API MediaRecorder używa widoku SurfaceView, więc jeśli Widok surface view nie jest poprawnie skonfigurowany spowoduje to zielone migotanie, które widzisz

Upewnij się, że używasz przepływności wideo, która może obsługiwać nową rozdzielczość - spróbuj zwiększyć przepływność wideo, aby podwoić wartość pierwotnie ustawioną (*zauważ, że drastycznie wpływa to na rozmiar pliku wyjściowego)

CamcorderProfile.Quality_high zwraca najwyższą możliwą obsługiwaną rozdzielczość kamery. Upewnij się, że używasz prawidłowego identyfikatora kamery ( przód vs. tył) - może tylna kamera obsługuje 1080p, ale przednia kamera nie?

Mam nadzieję, że wskazówki pomogą!

 0
Author: jagsaund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-23 23:04:57