看来这一定会发生在许多不同的情况下,例如添加字幕。我想要做的是抓取一个框架,更改其中的某些功能,然后“将其放回去”,以便最终用户看到此更改。我想我知道如何抓取和修改框架,但将其重新插入流中我不知道该怎么做。希望有链接或代码。
最佳答案
在直播中,根据最终目标可能需要考虑一些事项。如果这是真正的数据包/帧级别操作,您可能需要进行修改并将输出设置为新流(源保持不变,但新流进行了修改)。内联修改流会很成问题。
Packet level modification using IMediaStreamLivePacketNotify
您可以实现 IMediaStreamLivePacketNotify 接口(interface)来处理新数据包并根据需要修改它们。实现示例:
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 中有类似的功能更广泛地了解此实现。
Packet level modification using getPlayPackets()
您还可以查看 IMediaStream 对象并利用 IMediaStream.getPlayPackets() 功能。然后,您可以获取数据包并根据需要在持续处理入站流的相应线程中进行修改。此后,您可以使用 Publisher 对象来发布新流(与上面类似)。
Metadata injection
但是,如果您只是想 inject some metadata这个过程变得更加基本。您可以修改源流中的 AMFDataList 以包含新的元信息。
Adding onto the stream
如果您希望将数据添加到内联流(而不是修改它),您可以简单地通过 ImediaStream 对象添加它:
IMediaStream.addAudioData(..)
关于Wowza:在播放时修改流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34191377/