我想要做的是将 h264 编码的实时摄像头流发送到 gstreamer。我已经见过很多使用 rtp 和 mpeg-ts 通过网络发送的示例。但问题是,所有这些示例都假设输入将由固定文件或实时流提供,这些文件或直播流已经在传输端口中进行了转码,如下所示。
客户: gst-launch-1.0 videotestsrc 水平速度=5 ! x264enc 调整=“零延迟”线程= 1 ! mpegtsmux! tcpserversink 主机=192.168.0.211 端口=8554
服务器:gst-launch-1.0 tcpclientsrc 端口=8554 主机=192.168.0.211 ! tsdemux! h264解析! avdec_h264! xvimagesink
但是,我的相机提供以下界面(用java编写,实际上在adnroid上工作)。该接口(interface)仅提供实时原始 h264 block 。
mReceivedVideoDataCallBack=newDJIReceivedVideoDataCallBack(){
@Override
public void onResult(byte[] videoBuffer, int size)
{
}
我可以创建 tcp session 来发送这些数据 block 。但是,如何将那些未打包在传输协议(protocol)中的数据转换为 gstreamer tcpclient 不稳定的格式? 在相机端将原始流转码为ts格式可以是一个解决方案。但我不知道如何从非文件和非传输格式数据进行转码。我已经搜索了 gstreamer 和 ffmpeg,但我现在无法使用支持的接口(interface),unitl 导出处理 h264 block 流的方法。 或者,有没有办法让 gstreamer 直接接受那些简单的原始 h264 block ?
最佳答案
我认为最好的解决方案是为您的视频源创建您自己的元素,然后使用您的元素和 mpegtsmux
构建管道。
但是,您可以使用appsrc + mpegtsmux
并通过 JNI 使用回调中的缓冲区提供您的 appsrc。
关于ffmpeg - 如何处理实时原始 h264 流以通过网络发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33492695/