Ahmed Mujtaba
Ahmed Mujtaba

Reputation: 2248

Video capturing in portrait mode but the orientation is wrong when played back with a media player

I'm trying to make a custom video app. The app captures a video using mediarecorder and uploads it to the website where it's played on a html5 media player. The issue is that, when I capture the video in portrait mode, the playback video on the website and on vlc player have it's orientation off by 90 degrees. I have tried various solution on the internet but none work for me.

Here's what my code for setting up the media recorder:

 private bool prepareMediaRecorder() {

        Android.Hardware.Camera.Parameters p = mCamera.GetParameters();
        List<Android.Hardware.Camera.Size> previewSizes = p.SupportedPreviewSizes.ToList();

        //mCamera = GetCameraInstance();
        //setCameraDisplayOrientation(Activity, cameraId, mCamera);

        mediaRecorder = new MediaRecorder();
        mCamera.Unlock();
        mediaRecorder.SetCamera(mCamera);

        mediaRecorder.SetAudioSource(AudioSource.Camcorder);
        mediaRecorder.SetVideoSource(VideoSource.Camera);
        mediaRecorder.SetOrientationHint(CameraS.result);

        if (currentapiVersion >= 16)
        {
            mediaRecorder.SetProfile(CamcorderProfile.Get(CamcorderQuality.High)); // requires API Level 8 or higher
        }
        else
        {
            mediaRecorder.SetProfile(CamcorderProfile.Get(CamcorderQuality.Q480p)); // requires API Level 8 or higher
        }

        //mediaRecorder.SetVideoFrameRate(30);
        mediaRecorder.SetOutputFile(localPath);
        mediaRecorder.SetMaxDuration(600000); // Set max duration 60 sec.
        mediaRecorder.SetMaxFileSize(50000000); // Set max file size 50M
        mediaRecorder.SetVideoSize(previewSizes[0].Width, previewSizes[0].Height);
        mediaRecorder.SetPreviewDisplay(mPreview.Holder.Surface);

        mediaRecorder.SetOrientationHint(getDisplayOrientationAngle());

        try
        {
            mediaRecorder.Prepare();
        }
        catch (IllegalStateException e)
        {
            releaseMediaRecorder();
            return false;
        }
        catch (Java.IO.IOException e)
        {
            releaseMediaRecorder();
            return false;
        }
        return true;

}

public int getDisplayOrientationAngle() {
        //Log.e("", "setDisplayOrientationAngle is call");
        int angle;


        var mDisplayRotation = Activity.WindowManager.DefaultDisplay.Rotation;
        // switch (MeasurementNativeActivity.DisplayRotation) {
        switch (mDisplayRotation)
        {
            case SurfaceOrientation.Rotation0: // This is display orientation
                angle = 90; // This is camera orientation
                break;
            case SurfaceOrientation.Rotation90:
                angle = 0;
                break;
            case SurfaceOrientation.Rotation180:
                angle = 270;
                break;
            case SurfaceOrientation.Rotation270:
                angle = 180;
                break;
            default:
                angle = 90;
                break;
        }
        //Log.v("", "media recorder displayRotation: " + mDisplayRotation);
        //Log.v("", "media recorder angle: " + angle);
        return angle;

}

The orientation of the video is fine when played on the phone app but on the website it's not. I tried to use FFMPEG encoder to rotate the video clockwise. This seemed to fix the orientation of the video, however the aspect ratio of the video is all messed up. The video is stretched vertically and goes off screen. The command I'm using to rotate and encode the video is as follows:

-y -i inputPath -vf scale=640:480,setsar=1,transpose=1 -strict experimental -r 25 -vcodec mpeg4 -b 1000k ab 48000 -ac 2 -ar 22050 destinationPath

I will really appreciate if someone can help me fix either the orientation of the video or the aspect ration after encoding the video.

Cheers!

Edit.

Here's the readout of the input file:

General
Complete name                  : C:\Users\Ahmed\Desktop\9adcdb56-500e-4d3f-8fb2-ccf20c680422_yt.mp4
Format                         : MPEG-4
Format profile                 : Base Media
Codec ID                       : isom
File size                      : 6.30 MiB
Duration                       : 12s 437ms
Overall bit rate               : 4 251 Kbps
Encoded date                   : UTC 2016-05-29 23:54:30
Tagged date                    : UTC 2016-05-29 23:54:30

Video
ID                             : 1
Format                         : AVC
Format/Info                    : Advanced Video Codec
Format profile                 : [email protected]
Format settings, CABAC         : No
Format settings, ReFrames      : 1 frame
Format settings, GOP           : M=1, N=31
Codec ID                       : avc1
Codec ID/Info                  : Advanced Video Coding
Duration                       : 12s 323ms
Bit rate                       : 3 967 Kbps
Width                          : 1 280 pixels
Height                         : 720 pixels
Display aspect ratio           : 16:9
Rotation                       : 90°
Frame rate mode                : Variable
Frame rate                     : 29.700 fps
Minimum frame rate             : 29.354 fps
Maximum frame rate             : 30.040 fps
Color space                    : YUV
Chroma subsampling             : 4:2:0
Bit depth                      : 8 bits
Scan type                      : Progressive
Bits/(Pixel*Frame)             : 0.145
Stream size                    : 5.83 MiB (92%)
Title                          : VideoHandle
Language                       : English
Encoded date                   : UTC 2016-05-29 23:54:30
Tagged date                    : UTC 2016-05-29 23:54:30

Audio
ID                             : 2
Format                         : AAC
Format/Info                    : Advanced Audio Codec
Format profile                 : LC
Codec ID                       : 40
Duration                       : 12s 437ms
Source duration                : 12s 454ms
Bit rate mode                  : Constant
Bit rate                       : 128 Kbps
Nominal bit rate               : 96.0 Kbps
Channel(s)                     : 2 channels
Channel positions              : Front: L R
Sampling rate                  : 48.0 KHz
Compression mode               : Lossy
Stream size                    : 194 KiB (3%)
Source stream size             : 194 KiB (3%)
Title                          : SoundHandle
Language                       : English
Encoded date                   : UTC 2016-05-29 23:54:30
Tagged date                    : UTC 2016-05-29 23:54:30
mdhd_Duration                  : 12454

Upvotes: 1

Views: 1039

Answers (1)

Gyan
Gyan

Reputation: 93048

The beginning should be -y -noautorotate -i inputPath -vf transpose=1,scale=360:640,setsar=1 -metadata:s:v rotate=0

If the rotation tag isn't stripped, some players will still show a rotated video. Also, ffmpeg versions under a year old will automatically strip the tag and rotate the video. That can lead to unexpected behavior if you are manually applying rotation.

Upvotes: 2

Related Questions