問題タブ [riff]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 8 ビット (ビット/サンプル) の PCM WAV ファイルに複数のチャンネルを含めることはできますか?
私はこの考えを無視するのは悪いことだと気づきましnumber of channels
たbits per sample
. 私の理由は、2 チャンネル 8 ビット PCM ファイルのサンプルがどのように見えるか分からないからです。
ですか1 sample = 1 channel
?また1 sample = 4 bits (left) + 4 bits (right)
コンテキスト: WAV ファイルを読み取るプログラムを書いています。8 ビットの PCM WAV ファイルを見つけた場合、コードがこのように読み取られた場合 (以下を参照)、私のプログラムは複数のファイルを適切に読み取ることができません。チャネル 8 ビット PCM WAV ファイル。
wav - RIFF ファイル形式標準の最新の代替手段はありますか?
RIFF 規格は好きですが、ファイルの長さが 4GB に制限されているのは好きではありません。RIFF のようなバイナリ データを格納するための適切な最新のファイル形式標準はありますか?
長い WAV ファイルの場合、Adobe プログラムは基本的にファイル長のバイトを無視するだけですが、新しいファイル形式を作成する場合、バイトだけを含めて使用しないのは奇妙に思えます。RIFFが現代のフォーマットで一般的に眉をひそめているとしたら、それともノーですか?
java - Java: オブジェクトと型キャストに頼らない RIFF コンテナーの解析
Java で RIFF コンテナーを解析するためのコードをいくつか書いています (教育目的で、Java.wav
または他の RIFF ファイルをロードするライブラリがたくさんあることを知っています)。私のデザインの目標は、可能な限りフォーマットに固執することです。
ウィキペディアによると、基本的な RIFF 形式は非常に単純です。
- 4 バイト: このチャンクの ASCII 識別子 (例は "fmt " と "data" です。"fmt " 内のスペースに注意してください)。
- 4 バイト: このチャンクの長さを持つ符号なしのリトル エンディアン 32 ビット整数 (このフィールド自体とチャンク識別子を除く)。
- 可変サイズ フィールド: 前のフィールドで指定されたサイズのチャンク データ自体。
- チャンクの長さが偶数でない場合は、パッド バイト。
現在、可変サイズのフィールドの表現に苦労しています。これまでのところ、私が思いついた最高のものはそのように見えます。BaseFormat
1 つ目は、すべての形式解析クラスのベースとなる抽象クラスです。
ストリームへの参照を格納するだけで、実行read
されるメソッドとのインターフェースとして機能します。次に、2 つの主要な形式クラスがあります。
そこには派手なことは何もありません。簡潔にするために、クラスを投稿していません。これは、、、、などの便利なユーティリティ関数を備えMyStream
た非常に単純なラッパーです。InputStream
getInt
getByte
getAsciiString
RIFF 形式のすべての部分は、独自のクラスを取得します。RIFF ファイル全体はRiff
であり、チャンクをクラスとして読み取ろうとし、Chunk
チャンク ヘッダー + ボディを読み取ろうとします。そして魔法が起こります。大きなswitch
内部Chunk.read()
が、チャンク内のどのフォーマット クラスを適用するかを選択します。つまりFmt1Body
、Fmt2Body
などです。
それは機能し、実際に RIFF ファイルを読み取ることができます。私が抱えている問題は、すべての異なるチャンク形式が、共通点のない異なるクラスによって表されることです。したがって、メモリ内で解析されたファイルを操作する場合、多くの型チェックとアップキャストを行うことになります。つまり、次のようなものです。
などなど。これは多くの関数型言語では正常ですが、Java では悪い方法だと思います。Object
+型チェック+アップキャスト(または、BaseFormat
とにかくキャストが必要になるような同等に役に立たないインターフェース)に頼らずに、メモリ内のRIFFコンテナを表現するより良い方法はありますか?
サブフォーマット クラスのソース
stream
サブフォーマット クラスに関心のある方のために、メソッドと havingread()
メソッドを使用する以外に共通点がないことを示すサンプルをいくつか示します。