我尝试创建mpegts演示文稿时间戳。它的长度为5个字节。我在VLC播放器的源代码中找到了解决方案。它看起来像这样(在C语言代码中):
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个字节。 例如,我需要从2350十进制数的5个字节。二进制视图:
1001 0010 1110
在VLC操作之后,我必须有这个二进制视图:
0010 000 1 000000000000000 1 000100100101110 1
十六进制视图:
21 00 01 12 5D
我怎样才能用Java做到这一点?
我也在GitHub上找到了Java解决方案:https://github.com/taktod/myLib/blob/master/myLib.MIT/myLib.container.mpegts/src/main/java/com/ttProject/container/mpegts/field/PtsField.java 但这种认识太难了。对于一次性操作,有必要创建太多的辅助类,如Bit1,Bit2,Bit3等......
答案 0 :(得分: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