我为ffmpeg创建了TPorocess,以便在Linux Ububntu 14.04中从/ dev / video0流式传输视频。工作5分钟后,流发送停止,并且在接收方(ffplay)图片冻结。
奇怪的是-如果我尝试使用cat / procs / 3535(其中3535是ffmpeg PID)读取ffmpeg的标准输出,它将继续工作,客户端会再次看到实时图像!在接下来的5分钟工作之后,这种情况会重复出现。读取标准输出的调用再次有所帮助。
当我以相同的方式播放音频流时,不会发生这种情况。 当我从终端启动ffmpeg视频流时,它可以正常工作!
OS Linux Ubuntu 14.04 32位。使用GCC 4.8构建的FFmpeg v3.4
FFmpeg起始字符串:
ffmpeg -vsync drop -frame_drop_threshold 1 -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -pix_fmt yuv420p -tune zerolatency -preset ultrafast -b 500k -fflags +genpts -f rtp rtp://10.0.6.70:2666
免费的Pascal代码:
FVideoTranslation := TProcessUTF8.Create(nil);
FVideoTranslation.Options := [poUsePipes];
with FVideoTranslation do
begin
Executable := Format(PATH_PATTERN, [FProgramPath, TRANSLATION_PROGRAM]);
Parameters.Add('-vsync');
Parameters.Add('drop');
Parameters.Add('-frame_drop_threshold');
Parameters.Add('1');
DeviceParams := GetCaptureParam(AVideoDevice, dtVideo);
for i := 0 to DeviceParams.Count - 1 do
Parameters.Add(DeviceParams[i]);
FreeAndNil(DeviceParams);
Parameters.Add('-vcodec');
Parameters.Add('libx264');
Parameters.Add('-pix_fmt');
Parameters.Add('yuv420p');
Parameters.Add('-tune');
Parameters.Add('zerolatency');
Parameters.Add('-preset');
Parameters.Add('ultrafast');
Parameters.Add('-b');
Parameters.Add('500k');
Parameters.Add('-fflags');
Parameters.Add('+genpts');
Parameters.Add('-f');
Parameters.Add('rtp');
Parameters.Add('rtp://%s:%d', [AAbonentIp, AVideoPort]);
Execute();
Log.AddMessage(Parameters.Text);
end;
SdpInfo.Clear;
while (SdpInfo.Count = 0) do
try
SdpInfo.LoadFromStream(FVideoTranslation.Output);
except
on E: Exception do
Log.AddMessage('VideoTranslation.Output: ' + E.Message);
end;
Log.AddMessage(SdpInfo.Text);
FVideoFile := SdpInfo.Text;
有何建议?