/// <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); // 最初のフレームを描画 } }
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(); }