微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法证明 Long :: String :: Option[Long] :: Option[java.util.UUID] :: shapeless.HNil 可以与 SimpleMp4BoxHeader 相互转换

如何解决无法证明 Long :: String :: Option[Long] :: Option[java.util.UUID] :: shapeless.HNil 可以与 SimpleMp4BoxHeader 相互转换

我是初学者,正在处理 MP4 文件解码。当我编写如下代码时,它报告“无法证明 Long :: String :: Option[Long] :: Option[java.util.UUID] :: shapeless.HNil 可以转换为/从 SimpleMp4BoxHeader”。我该如何解决这个问题?

sealed trait Mp4BoxHeader {
  def size: Int
  def btype: String
}

case class SimpleMp4BoxHeader(size: Int,btype: String) extends Mp4BoxHeader

object SimpleMp4BoxHeader {
  // val scodec = uint32 ~ ascii32

  def apply(size: Int,btype: String): SimpleMp4BoxHeader = SimpleMp4BoxHeader(size,btype)

  implicit def codec: Codec[SimpleMp4BoxHeader] = "simpleMp4BoxHeader" | { ("size" | uint32 ) :: ("btype" | ascii32) }.as[SimpleMp4BoxHeader]

}

解决方法

这是因为 uint32 对于 Codec 类型是 Long 而你的 size 应该是 Int,看看 scodec.codecs 包对象:

/**
 * Codec for 16-bit unsigned big-endian integers.
 * @group numbers
 */
val uint16: Codec[Int] = new IntCodec(16,false,ByteOrdering.BigEndian)

/**
 * Codec for 24-bit unsigned big-endian integers.
 * @group numbers
 */
val uint24: Codec[Int] = new IntCodec(24,ByteOrdering.BigEndian)

/**
 * Codec for 32-bit unsigned big-endian integers.
 * @group numbers
 */
val uint32: Codec[Long] = new LongCodec(32,ByteOrdering.BigEndian)

有一些编解码器,并为CodecIntuint24)选择最兼容的uint16,将uint32替换为它,您的代码将编译.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。