0

libsndfile (c# ラッパーを使用) を使用して、既存の wav ファイルに基づいて wav/aiff ファイルを作成しています。たとえば、ステレオ ファイルをモノラル ファイルに、またはその逆に変換しています。

私のプロセスは次のとおりです。

  1. 既存のファイルを読み取る
  2. LibsndfileInfo の入力中に新しいファイルを書き込み用に開く
  3. WriteItems を新しいファイルに

                LibsndfileInfo fInfo = new LibsndfileInfo();
                fInfo.Format = info.Format;
                fInfo.Channels = info.Channels;
                fInfo.SampleRate = info.SampleRate;              
    
                IntPtr sndOutFile = api.Open(outfilename, LibsndfileMode.Write, ref fInfo);
    
                api.WriteItems(sndOutFile, data, num_items);
    
                api.Close(sndOutFile);
    

そうしているうちに、元のファイルにあった余分なメタ データ (余分なチャンク) が、結果のファイルで失われていることに気付きました。

libsndfile を使用して、これらの余分なチャンクを何らかの方法で移動するか、ヘッダーを新しいファイルにコピーする方法はありますか?

ご意見ありがとうございます。

マイク

4

1 に答える 1

0

C# ラッパーはわかりませんが、libsndfile C および C++ API には、ブロードキャスト情報やその他の文字列などのチャンクに含まれる情報の読み取りと書き込みを可能にするコマンド関数があります。

// Open input file
SndfileHandle inputFile(inputFileName, SFM_READ);

// Read broadcast info:
SF_BROADCAST_INFO binfo;
file.command(SFC_GET_BROADCAST_INFO, &binfo, sizeof (binfo));

std::cout() << binfo.description;

// Open output file with same parameters:
SndfileHanle outputFile(outputFileName, SFM_WRITE, inputFile.format(), inputFile.channels(), inputFile.samplerate());

// Copy broadcast info:
outputFile.command(SFC_SET_BROADCAST_INFO, &binfo, sizeof (binfo));

// Copy other string info:
outputFile.setString(SF_STR_TITLE, inputFile.getString(SF_STR_TITLE));
outputFile.setString(SF_STR_COPYRIGHT, inputFile.getString(SF_STR_COPYRIGHT));
outputFile.setString(SF_STR_SOFTWARE, inputFile.getString(SF_STR_SOFTWARE));
outputFile.setString(SF_STR_ARTIST, inputFile.getString(SF_STR_ARTIST));
outputFile.setString(SF_STR_COMMENT, inputFile.getString(SF_STR_COMMENT));
outputFile.setString(SF_STR_DATE, inputFile.getString(SF_STR_DATE));
outputFile.setString(SF_STR_ALBUM, inputFile.getString(SF_STR_ALBUM));
outputFile.setString(SF_STR_LICENSE, inputFile.getString(SF_STR_LICENSE));
outputFile.setString(SF_STR_TRACKNUMBER, inputFile.getString(SF_STR_TRACKNUMBER));
outputFile.setString(SF_STR_GENRE, inputFile.getString(SF_STR_GENRE));

// Copy sound data:
....
于 2016-02-02T21:03:36.777 に答える