【发布时间】:2018-05-08 14:57:46
【问题描述】:
在任何地方都没有完整的示例。在 live555 文件夹中,有以下程序:testRTSPClient.cpp,它访问一个 RTSP 并接收原始 RTP 数据包,但对它们不做任何事情。它通过DummySink 类接收它们。
有一个 example 关于如何使用 testRTSPClient.cpp 从 h264 接收 NAL 单元,但是 live555 有专门针对每个编解码器的自定义接收器类,因此使用它们要好得多。示例:H264or5VideoRTPSink.cpp。
因此,如果我用testRTSPClient.cpp 中的H264or5VideoRTPSink 子类的实例替换DummySink 的实例并让这个子类接收我认为它可能工作的帧。
如果我只是按照DummySink的实现,我只需要写这样的东西:
class MyH264VideoRTPSink: public H264VideoRTPSink {
public:
static MyH264VideoRTPSink* createNew(UsageEnvironment& env,
MediaSubsession& subsession, // identifies the kind of data that's being received
char const* streamId = NULL); // identifies the stream itself (optional)
private:
MyH264VideoRTPSink(UsageEnvironment& env, MediaSubsession& subsession, char const* streamId);
// called only by "createNew()"
virtual ~MyH264VideoRTPSink();
static void afterGettingFrame(void* clientData, unsigned frameSize,
unsigned numTruncatedBytes,
struct timeval presentationTime,
unsigned durationInMicroseconds);
void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
struct timeval presentationTime, unsigned durationInMicroseconds);
// redefined virtual functions:
virtual Boolean continuePlaying();
u_int8_t* fReceiveBuffer;
MediaSubsession& fSubsession;
char* fStreamId;
};
如果我们查看DummySink,它表明afterGettingFrame 是接收帧的函数。但是在哪里接收到的帧?我怎样才能访问它?
void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
struct timeval presentationTime, unsigned /*durationInMicroseconds*/) {
// We've just received a frame of data. (Optionally) print out information about it:
更新:
我创建了自己的 H264 Sink 类:https://github.com/lucaszanella/jscam/blob/f6b38eea2934519bcccd76c8d3aee7f58793da00/src/jscam/android/app/src/main/cpp/MyH264VideoRTPSink.cpp,但它的 createNew 与 DummySink 中的不同:
createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat);
根本没有提到RTPgs 是什么意思,rtpPayloadFormat 也没有。我什至不知道我是否走在正确的轨道上......
【问题讨论】:
-
你使用H264VideoRTPSink提取h264数据成功了吗
-
@Riskhan 我什至没有尝试过,那东西的编码和记录都很糟糕。我用github.com/Ansersion/myRtspClient
-
是的,你是对的。我会尝试上面的链接。谢谢老哥及时回复
-
@Riskhan 它在示例文件夹中的示例非常有用,您还可以看到我所做的:github.com/lucaszanella/orwell/blob/… 它的编码非常糟糕,因为我还没有清理东西但是看看
-
好吧。我会看看
标签: c++ video-streaming h.264 codec live555