예제 #1
0
        /// <summary>
        /// ファイルを開く。NotOpened 状態以外の場合は Close() が呼び出された後にファイルを開く。
        /// </summary>
        /// <param name="filename">ファイルパス。存在確認はしない。</param>
        /// <param name="width">動画サイズを固定する場合の幅(負の値を指定した場合は元の動画サイズになる)</param>
        /// <param name="height">動画サイズを固定する場合の高さ(負の値を指定した場合は元の動画サイズになる)</param>
        /// <param name="memory_size">使用するメモリサイズ(MB)(負の値を指定した場合は自動設定)</param>
        public void OpenFile(string filename, int video_width, int video_height, int memory_size)
        {
            if (state_ != StateKind.NotOpened)
            {
                Close();
            }
            System.Diagnostics.Debug.Write("VideoController.OpenFiles");

            avcodec_manager_.Open(filename, video_width, video_height, memory_size);

            bool is_open_waveout = false, is_open_drawing_thread = false;

            try
            {
                if (avcodec_manager_.HasAudio)
                {
                    waveout_.AudioCallback = AudioCallback;
                    waveout_.TimeOut       = TimeOutCallback;
                    waveout_.Stopped       = StoppedCallback;
                    waveout_.Open(avcodec_manager_.AudioSampleRate, avcodec_manager_.AudioChannel,
                                  avcodec_manager_.AudioBytesPerSample * 8);
                    is_open_waveout = true;
                }

                frame_per_sec_ = (double)avcodec_manager_.Rate / avcodec_manager_.Scale;
                end_frame_     = avcodec_manager_.FrameLength;
                user_.InformChangingFrame(0);
                if (avcodec_manager_.HasVideo)
                {
                    drawing_thread_ = new DrawingThread(avcodec_manager_.Width, avcodec_manager_.Height, picture_box_handle);
                    drawing_thread_.Start();
                    is_open_drawing_thread = true;
                    user_.SetPictureBoxSize(new Size(avcodec_manager_.Width, avcodec_manager_.Height));
                }
                main_thread_ = new Thread(new ThreadStart(Run));
                main_thread_.IsBackground = true;
                main_thread_.Start();
            }
            catch
            {
                if (avcodec_manager_.HasAudio && is_open_waveout)
                {
                    waveout_.Close();
                }
                if (avcodec_manager_.HasVideo && is_open_drawing_thread)
                {
                    drawing_thread_.Close();
                }
                throw;
            }

            state_ = StateKind.Prepared;

            user_.InvalidatePictureBox();
            if (avcodec_manager_.HasVideo)
            {
                DrawWhileGetting(0); // 最初のフレームを描画
            }
        }
예제 #2
0
        private void Clear()
        {
            start_tick_time_ = 0;
            start_frame_     = 0;
            end_frame_       = 0;
            current_frame_   = 0;
            frame_per_sec_   = 24.0;

            is_wave_playing_ = false;

            current_wave_pos_ = 0;

            main_thread_ = null;
            thread_end_event_.Reset();

            stopping_point_list_.Clear();

            drawing_thread_ = null;

            command_queue_.Clear();
        }