我想要做的是将由h264编码的实时摄像机流发送到gstreamer。我已经看过许多使用rtp和mpeg-ts通过网络发送的示例。但问题在于,所有这些示例都假设输入将由固定文件或实时流提供,该流已经在传输协议中进行转码,如下所示。
客户: gst-launch-1.0 videotestsrc horizontal-speed = 5! x264enc tune =“zerolatency”threads = 1! mpegtsmux! tcpserversink host = 192.168.0.211 port = 8554
server:gst-launch-1.0 tcpclientsrc port = 8554 host = 192.168.0.211! tsdemux! h264parse! avdec_h264! xvimagesink
但是,我的相机提供以下界面(用java编写,实际上在adnroid上工作)。该界面仅提供实时原始h264块。
mReceivedVideoDataCallBack=newDJIReceivedVideoDataCallBack(){
@Override
public void onResult(byte[] videoBuffer, int size)
{
}
我可以创建tcp会话来发送那些数据块。但是,如何将那些未在传输协议中打包的数据转换为gstreamer tcpclient可以理解的格式? 在相机端以ts格式转码原始流可以是一种解决方案。但我不知道从非文件和非传输格式数据进行转码。我搜索过gstreamer和ffmpeg,但是我无法使用支持的接口unitl来处理h264块流。 或者,有没有办法让gstreamer直接接受那些简单的原始h264块?
答案 0 :(得分:0)
我认为最好的解决方案是为您的视频源创建自己的元素,然后使用您的元素和mpegtsmux
构建管道。
但是,您可以使用appsrc + mpegtsmux
并通过JNI向您的appsrc提供回调中的缓冲区。