Запись видео с фронтальной камеры - WP8 - C#

Моему приложению для Windows Phone необходимо записать видео с фронтальной камеры и отправить его на сервер через веб-сервис.

Вот пока я пытаюсь записать видео с front-camera, Я собираюсь mirror inverted video, Означает запись с фронтальной камеры на 180 градусов.

что я думаю, вероятно, единственное решение этого состоит в том, чтобы повернуть поток записанного видео на 180 градусов назад.

Вопрос:

  • Есть ли другое решение для записи правильного видео с фронтальной камерой в wp8?
  • если нет, то как повернуть видеопоток на 180 градусов? любой c# API для этого..?

Редактировать:

Вот код, который я использую:

Код XAML дляVideoBrush

    <Canvas x:Name="CanvasLayoutRoot" RenderTransformOrigin="0.5 0.5"
            Width="{Binding ActualHeight, ElementName=LayoutRoot}"
            Height="{Binding ActualWidth, ElementName=LayoutRoot}"
            Margin="-160 0 0 0">
        <!--Background="Transparent"-->

        <Canvas.Background>
            <VideoBrush x:Name="videoBrush" />
        </Canvas.Background>
        <Canvas.RenderTransform>
            <RotateTransform x:Name="rt" />
        </Canvas.RenderTransform>

    </Canvas>

Инициализация камеры

    public async void InitializeVideoRecorder()
    {
        try
        {
            if (videoCapture == null)
            {
                // below line of code will detect if "Front Camera" is available or not
                // if availble, then open it or it will open "Back Camera"

                videoCapture = await AudioVideoCaptureDevice.OpenAsync(
                    AudioVideoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front) ? CameraSensorLocation.Front : CameraSensorLocation.Back,
                    new Windows.Foundation.Size(640, 480));

                videoCapture.RecordingFailed += videoCapture_RecordingFailed;

                videoCapture.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, videoCapture.SensorRotationInDegrees);

                // Initialize the camera if it exists on the phone.
                if (videoCapture != null)
                {
                    videoBrush.SetSource(videoCapture);
                    if (!AudioVideoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front))
                    {
                        rt.Angle = videoCapture.SensorRotationInDegrees;
                    }
                    else
                    {
                        rt.Angle = -(videoCapture.SensorRotationInDegrees);
                    }
                }
                else
                {
                    MessageBox.Show("Unable to load Camera. Please try again later.", App.appName, MessageBoxButton.OK);
                    NavigationService.GoBack();
                }
            }
        }
        catch (Exception ex)
        {
            (new WebServices()).catchExceptions(ex);
            NavigationService.GoBack();
        }
    }

Запуск VideoCapture

    private async Task StartVideoRecording()
    {
        try
        {
            // Gets the application data folder
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
            StorageFolder transfersFolder = await (await applicationFolder.GetFolderAsync("Shared")).GetFolderAsync("Transfers");

            // Create the file specified in the application data folder
            videoFileName = selectedQue.response.template_id + "_" + selectedQue.response.id + "_" + selectedQue.response.invite_id +".mp4";
            StorageFile storageFile = await transfersFolder.CreateFileAsync(videoFileName, CreationCollisionOption.ReplaceExisting);

            // Open a file stream, ready to write video data
            randomAccessStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);

            // Video recording to the specified stream
            await videoCapture.StartRecordingToStreamAsync(randomAccessStream);
            isRecordingStarted = true;

            //timer = "0:00";
            tbTimer.Text = "0:00";
            dt.Start();
        }
        catch (Exception ex)
        {
            (new WebServices()).catchExceptions(ex);
        }
    }

2 ответа

Решение

Наконец я решил свою проблему после 24 часов усилий с помощью нижеприведенного решения.

Строка кода, вызывающая проблему при повороте видео, была ниже.

videoCapture.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, videoCapture.SensorRotationInDegrees);

здесь videoCapture является объектом AudioVideoCaptureDevice

При использовании фронтальной камеры нам нужно инвертировать вращение cameraSensor,

Так что я использовал вышеупомянутый код (упомянутый в вопросе) с одной крошечной модификацией в этом videoCapture.SetProperty строка кода. правильная строка кода, как показано ниже.

videoCapture.SetProperty(KnownCameraGeneralProperties.EncodeWithOrientation, -(videoCapture.SensorRotationInDegrees));

Я просто перевернул videoCapture.SensorRotationInDegrees добавив один знак минус (-) перед ним.

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

В прошлом это работало для меня, это было просто приложение для сканирования штрих-кодов, которое я запрограммировал для выполнения функциональных требований. Я положил преобразование на <VideoBrush>,

<Grid x:Name="ContentPanel" Margin="12,0,12,0">
    <Canvas x:Name="cam_canvas" Width="480" Height="480">                
        <Canvas.Background>
            <VideoBrush x:Name="cam_video_brush" Stretch="None">
                <VideoBrush.RelativeTransform>
                    <CompositeTransform Rotation="90" CenterX="0.5" CenterY="0.5" />
                </VideoBrush.RelativeTransform>
            </VideoBrush>
        </Canvas.Background>
    </Canvas>
</Grid>
Другие вопросы по тегам