/// <summary> /// 設定を基にAviUtl拡張編集ファイルの保存処理を行う。 /// </summary> /// <param name="exoFilePath">AviUtl拡張編集ファイルパス。</param> /// <param name="waveFilePath">WAVEファイルパス。</param> /// <param name="text">テキスト。</param> /// <param name="common">共通設定。</param> /// <param name="charaStyle">キャラ別スタイル。</param> /// <returns>保存した拡張編集オブジェクト。失敗したならば null 。</returns> private static async Task <ExEditObject> DoOperateExoSave( string exoFilePath, string waveFilePath, string text, ExoCommonConfig common, ExoCharaStyle charaStyle) { // フレーム数算出 int frameCount = 0; try { var waveTime = await Task.Run(() => (new WaveFileInfo(waveFilePath)).TotalTime); var f = (waveTime.Ticks * common.Fps) / (charaStyle.PlaySpeed.Begin * (TimeSpan.TicksPerSecond / 100)); frameCount = (int)decimal.Floor(f); // 拡張編集の仕様に合わせて切り捨て } catch (Exception ex) { ThreadTrace.WriteException(ex); return(null); } var exo = new ExEditObject { Width = common.Width, Height = common.Height, Length = frameCount + common.ExtraFrames, AudioSampleRate = common.AudioSampleRate, AudioChannelCount = common.AudioChannelCount, }; // decimal の小数部桁数を取得 var scale = (decimal.GetBits(common.Fps)[3] & 0xFF0000) >> 16; exo.FpsScale = (int)Math.Pow(10, scale); exo.FpsBase = decimal.Floor(common.Fps * exo.FpsScale); // テキストレイヤー追加 { var item = new LayerItem { BeginFrame = 1, EndFrame = exo.Length, LayerId = 1, GroupId = common.IsGrouping ? 1 : 0, IsClipping = charaStyle.IsTextClipping }; var c = charaStyle.Text.Clone(); ExoTextStyleTemplate.ClearUnused(c); c.Text = text; item.Components.Add(c); item.Components.Add(charaStyle.Render.Clone()); exo.LayerItems.Add(item); } // 音声レイヤー追加 { var item = new LayerItem { BeginFrame = 1, EndFrame = frameCount, LayerId = 2, GroupId = common.IsGrouping ? 1 : 0, IsAudio = true, }; item.Components.Add( new AudioFileComponent { PlaySpeed = charaStyle.PlaySpeed.Clone(), FilePath = waveFilePath, }); item.Components.Add(charaStyle.Play.Clone()); exo.LayerItems.Add(item); } // ファイル書き出し try { await ExoFileReaderWriter.WriteAsync(exoFilePath, exo); } catch (Exception ex) { ThreadTrace.WriteException(ex); return(null); } return(exo); }
/// <summary> /// ファイル内容を用いてテキストスタイル雛形コレクションを更新する。 /// </summary> /// <param name="filePath">ファイルパス。</param> private async Task UpdateTextStyleTemplates(string filePath) { if (filePath == null) { return; } var info = new FileInfo(filePath); // ファイルサイズチェック if (info.Length > TemplateFileSizeLimitMB * 1024L * 1024) { this.SetLastStatus( AppStatusType.Warning, @"ファイルサイズが大きすぎます。", subStatusText: @"許容サイズは " + TemplateFileSizeLimitMB + @" MBまでです。"); return; } // ファイル読み取り ExEditObject exo = null; try { exo = await ExoFileReaderWriter.ReadAsync(info); } catch (FormatException ex) { ThreadTrace.WriteException(ex); this.SetLastStatus( AppStatusType.Fail, @"ファイルの読み取りに失敗しました。", subStatusText: @".exo ファイルではない可能性があります。"); return; } catch { this.SetLastStatus( AppStatusType.Fail, @"ファイルの読み取りに失敗しました。"); return; } // 読み取り成功時点で直近ファイルパス上書き try { this.LastTemplateFilePath.Value = Path.GetFullPath(filePath); } catch { this.LastTemplateFilePath.Value = filePath; } // 雛形作成 var temps = await Task.Run( () => MakeTextStyleTemplates(exo.LayerItems, TemplateLimitCount)); if (temps == null || temps.Count <= 0) { this.SetLastStatus( AppStatusType.Warning, @"ファイル内にテキストオブジェクトが存在しません。"); return; } // プロパティ上書き this.Templates.Value = temps.AsReadOnly(); this.SelectedTemplateIndex.Value = 0; this.SetLastStatus( AppStatusType.Success, @"ファイルの読み取りに成功しました。", subStatusText: @"テキスト設定を " + this.Templates.Value.Count + @" 件ロードしました。"); }