2016-11-27 24 views
0

mpegtsプレゼンテーションタイムスタンプを作成しようとしています。これは5バイトの長さです。私はVLCプレーヤーのソースコードに解決策を見つけました。Javaでバイト配列にビットを書き込むにはどうすればよいですか?

bits_write(&bits, 4, i_pts_dts); // '0010' or '0011' 
bits_write(&bits, 3, i_pts >> 30); 
bits_write(&bits, 1, 0x01); // marker 
bits_write(&bits, 15, i_pts >> 15); 
bits_write(&bits, 1, 0x01); // marker 
bits_write(&bits, 15, i_pts); 
bits_write(&bits, 1, 0x01); // marker 
i_header_size -= 0x5; 

これは、40ビットから5バイトを収集する必要があることを意味します。これは、次のようになります(C言語コード)。 たとえば、2350の10進数から5バイトが必要です。バイナリビュー:

0010 000 1 000000000000000 1 000100100101110 1 

六角ビュー:私はJavaでそれを行うことができますどのように

21 00 01 12 5D 

VLC操作後

私はこのバイナリビューを持っている必要がありますか?

またGitHubでJavaソリューションが見つかりました:https://github.com/taktod/myLib/blob/master/myLib.MIT/myLib.container.mpegts/src/main/java/com/ttProject/container/mpegts/field/PtsField.java しかし、この実現は難しすぎます。 1回の操作のために、などのビット1、ビット2、ビット3、のようにあまりにも多くのヘルパークラスを作成する必要がある...

+0

あなたの入力がマップをビット方法を決定出力バイトに、例えば紙に書いてから、[Javaビット操作演算子](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)を使用してその結果を作成します。 – Andreas

+0

@Andreas、私はビット操作演算子について知っています。例えば、私はStringで40ビットを処理することができ、longに変換した後にはlongに4バイトのサイズがあります。 Doubleには8バイトがあります。しかし、私は5バイトにする必要があります。どうすればいいのか分かりません。 – Virkom

答えて

0

これは、単純なビット操作です:

int dts = 2;  // must be 2 or 3 
long pts = 2350; // must be less than 8,589,934,592 

byte[] output = new byte[] { 
     (byte) (dts << 4 | pts >> 30 | 1), 
     (byte) (pts >> 22), 
     (byte) (pts >> 15 | 1), 
     (byte) (pts >> 7), 
     (byte) (pts << 1 | 1) 
}; 
for (byte b : output) 
    System.out.printf("%02x ", b); // prints: 21 00 01 12 5d 
+0

ああ素敵、高すぎ。 – Virkom

関連する問題