読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

音声ファイルから動画ファイルを生成する(26) – コピーコードを書き直した。

ということでテクスチャーと昨日コピーコードをMFCopyImageから自前のコードに書き直した。

// テクスチャをメディアバッファに書き込む
  void video_writer::set_texture_to_sample(ID3D11DeviceContext1* context, ID3D11Texture2D* texture)
  {
 
    // タイムスタンプの設定
    CHK(sample_->SetSampleTime(video_sample_time_));
 
    // 書き込み先バッファのロック
    unsigned char *pbBuffer = nullptr;
    CHK(buffer_->Lock(&pbBuffer, nullptr, nullptr));
 
    // 読み込みテクスチャをマップ
    D3D11_MAPPED_SUBRESOURCE mapped;
    CHK(context->Map(texture, 0, D3D11_MAP_READ, 0, &mapped));
 
    //CHK(MFCopyImage(pbBuffer, width_ * 4, reinterpret_cast<BYTE*>(mapped.pData), mapped.RowPitch, width_ * 4, height_));
 
    DWORD *dest = (DWORD*) pbBuffer;
    const UINT pitch = mapped.RowPitch / sizeof(DWORD);
    DWORD *src = (DWORD*) mapped.pData + (height_ - 1) * pitch;
 
    for (UINT i = 0; i < height_; ++i){
      for (UINT j = 0; j < width_; ++j){
        *dest++ = *src++;
      }
      src -= pitch * 2;
    }
 
    // 書き込み先バッファのアンロック
    CHK(buffer_->Unlock());
    // テクスチャをアンマップ
    context->Unmap(texture, 0);
    video_sample_time_ += hnsSampleDuration;
  }

内容はY座標を反転してコピーしているだけだ。実行したところ体感的にはスピードが落ちたようには感じなかったのでとりあえずこれでよしとする。でも処理時間は計ってみることにしようか。結果作成された動画は以下である。

これでWAVファイルから動画ビットマップを生成してH.264ファイルに収めるコードの基本部分はできたことにする。続いて何をするのかであるが、まず頭の中に浮かんでいるのは「フーリエ変換にかけてグライコ表示を作りたい」なのだが、ちょっと今のUIはDirect Compositionを試して放置している状態なのでこれをもうちょっとまともにしなくてはいけない。