似乎必须在许多不同的环境中发生这种情况,例如添加字幕。我想要做的是抓取一个框架,更改其中的一些功能,然后“将其放回”,以便最终用户看到此更改。我想我知道如何抓取和修改框架,但重新插入到流中我看不怎么做。非常感谢链接或代码。
答案 0 :(得分:2)
在直播中,根据最终目标的不同,有几点需要考虑。如果它是真正的数据包/帧级操作,您可能需要进行修改并将输出设置为新流(源保持未受损,但新流具有修改)。修改内联流将是非常有问题的。
使用IMediaStreamLivePacketNotify修改数据包级别
您可以实现IMediaStreamLivePacketNotify接口来处理新数据包并根据需要进行修改。示例实现:
private class PacketListener implements IMediaStreamLivePacketNotify
{
@Override
public void onLivePacket(IMediaStream stream, AMFPacket packet)
{
// handle packet modifications
}
}
修改数据包后,您可以将其发布到通过Publisher对象发布的辅助流。
Publisher.createInstance(vhost, appName, appInstName);
发布商包含将A / V数据添加到新流的功能:
switch (packet.getType())
{
case IVHost.CONTENTTYPE_AUDIO:
publisher.addAudioData(packet.getData(), packet.getAbsTimecode());
break;
case IVHost.CONTENTTYPE_VIDEO:
publisher.addVideoData(packet.getData(), packet.getAbsTimecode());
break;
case IVHost.CONTENTTYPE_DATA:
case IVHost.CONTENTTYPE_DATA3:
publisher.addDataData(packet.getData(), packet.getAbsTimecode());
}
Duplicate Streams module中有类似的功能可以更广泛地了解此实现。
使用getPlayPackets()
修改数据包级别
您还可以查看IMediaStream对象并利用IMediaStream.getPlayPackets()功能。然后,您可以获取数据包并根据需要在连续处理入站流的相应线程中进行修改。此后,您可以使用Publisher对象发布新流(类似于上面的内容)。
元数据注入
但是,如果您只是期待inject some metadata,那么这个过程会变得更加基础。您可以修改源流中的AMFDataList以包含新的元信息。
添加到流
如果您希望将数据添加到内联流(而不是修改它),您只需通过ImediaStream对象添加它:
IMediaStream.addAudioData(..)