小编Tho*_*mas的帖子

如何将H.264 UDP数据包转换为可播放的媒体流或文件(碎片整理)

在将SDP会话的UDP流转换为可解码的H.264流时,我遗漏了一些基本的东西.我正在使用支持H.264的摄像头进行测试,可以直接与播放器一起播放流.当我尝试播放翻译的流时,播放器将无法识别(缺少标题错误).但是,我必须解码UDP流才能将其集成到Java应用程序中,其中有一些解码器.

我已经看到了以下问题的非常好的答案:

  1. 如何处理原始UDP数据包,以便它们可以通过directshow源过滤器中的解码器过滤器进行解码
  2. 使用ffmpeg(libavcodec)通过RTP解码H264视频的问题

两者都有一些令人困惑的小差异(见下文).

但首先让我们看看容易的部分.正如我从相机中看到的那样,发送了SPS和PPS数据包.所有剩余的数据包都是索引或未索引的碎片帧.

对于没有帧的所有数据包(在我的情况下只有NALUnitType 7和8)我剥离RTP报头(12字节)并在前面添加起始字节3 x 0字节和1 x 1(00 00 00 01).

对于所有分段的帧数据包,我根据答案1的描述重建它们.因此详细地说,这意味着:RTP报头的条带(仅用于数据验证).然后从有效载荷中解码片段信息:

第一个字节:[3 NAL UNIT BITS | 5碎片类型位]
第二个字节:[START BIT | 结束位| 保留位| 5个NAL单位]

如果设置了起始位,则会有一个新的有效负载头,如下所示:[3 NAL UNIT BITS(从第一个字节开始)| 5 NAL UNIT BITS(来自第二个字节)]
这为非idr切片提供了NALUnitType 1,为idr切片提供了5.这是根据规范.

我使用这个新的有效负载头(1个字节)并将没有2个字节头的有效负载附加到新的包中.以相同的方式添加所有连续片段(12字节RTP标题的条带,2字节单元类型信息的条带),直到看到结束位信息.当看到结束时,我将开始字节(00 00 00 01)放在此数据包的前面并将其写入流.

问题是由于未知原因无法解码.我读过的答案的答案2的不同之处在于,有效载荷头的第二个字节也可能被放入翻译的数据包中.但我尝试了两个,但仍然没有运气.

可能在新构建的流中还有其他缺失的东西?或者我在碎片整理中犯了错误?

java udp rtp h.264 sdp

5
推荐指数
1
解决办法
3594
查看次数

如何在Intellij Idea中查找库引用

我有一个包含很多Maven库的复杂项目.我不时遇到库版本冲突的问题.我可以打开相互冲突的类,并查看包含类的所有库.但遗憾的是,我找不到一种简单的方法来检查Maven依赖项中引用这些库的位置.你知道如何在Maven树中找到一个库吗?

intellij-idea maven

5
推荐指数
2
解决办法
626
查看次数

Linux 下的 Java 不支持 Fractional Swing UI 比例

我想用默认的 L&F 影响标准 Swing 应用程序的 UI 比例。不幸的是,缩放因子 1.0 太小,2.0 太大。在我的 Linux 中,小数比例因子被简单地忽略。我已经搜索过,但找不到任何解决方案来使其工作。该量表适用于 1 或 2,但不适用于介于两者之间的值:

\n

\xe2\x80\x93Dsun.java2d.uiScale=1.5

\n

Java 是 1.15,但这并不重要,我已经尝试了不同的风格。Linux 是带有 XFCE 窗口管理器的 Ubuntu。

\n

java swing hidpi

5
推荐指数
0
解决办法
310
查看次数

大规模任务Runnable或Callable的替代模式

对于大规模并行计算,我倾向于使用执行程序和可调用程序.当我有数千个要计算的对象时,我觉得为每个对象实例化数千个Runnables并不是那么好.

所以我有两种方法来解决这个问题:

.将工作负载分成少量x工作者,每个工作者都给出y对象.(将对象列表拆分为每个y/x-size的x分区)

public static <V> List<List<V>> partitions(List<V> list, int chunks) {
      final ArrayList<List<V>> lists = new ArrayList<List<V>>();
      final int size = Math.max(1, list.size() / chunks + 1);
      final int listSize = list.size();
      for (int i = 0; i <= chunks; i++) {
         final List<V> vs = list.subList(Math.min(listSize, i * size), Math.min(listSize, i * size + size));
         if(vs.size() == 0) break;
         lists.add(vs);
      }
      return lists;
   }
Run Code Online (Sandbox Code Playgroud)

.创建从队列中获取对象的x-worker.

问题:

  • 创建数千个Runnables真的很贵并且要避免吗?
  • 是否有一个通用模式/建议如何通过解决方案II
  • 你知道一种不同的方法吗?

java multithreading

4
推荐指数
1
解决办法
1692
查看次数

标签 统计

java ×3

h.264 ×1

hidpi ×1

intellij-idea ×1

maven ×1

multithreading ×1

rtp ×1

sdp ×1

swing ×1

udp ×1