我使用stdout(管道格式:管道< -Y< -U< -V整个帧)将原始YUV444 640x480帧从C ++程序内部管理到ffmpeg。 ffmpeg使用h.264对它们进行编码,并通过UDP将视频流式传输到我选择的IP。
当我没有流式传输并将录像设备上的视频保存为带有ffmpeg的-mp4文件时,一切正常 - 但是当我通过网络流式传输并尝试在VLC中接收时,会收到流并且视频屏幕下的播放计时器运行, 但图像为黑色,没有显示视频。 我的音频输出也有一些噼里啪啦的声音。原始视频没有音轨。
我的ffmpeg设置如下:
ffmpeg -y -loglevel verbose -f rawvideo -r 25 -c:v rawvideo -pix_fmt yuv444p -s 640x480 -i - -c:v libx264 -preset superfast -framerate 25 -f mpegts udp://192.168.150.1:20001
在VLC(GUI)中,我只使用udp:// @:20001的“开放网络流”。端口是开放的,我用一个简单的虚拟发送器/接收器测试它。视频录制的几乎相同的cli参数在写入文件并下载时会产生完美的可播放视频:
ffmpeg -y -loglevel verbose -f rawvideo -r 25 -c:v rawvideo -pix_fmt yuv444p -s 640x480 -i - -c:v libx264 -preset superfast -framerate 25 video.mp4
如果我尝试使用流式传输相同的录制视频
ffmpeg -i video.mp4 -v 0 -vcodec mpeg4 -f mpegts udp://192.168.150:20001
我再次得到一个黑屏,就像上面一样。
VLC日志输出将我的流识别为mp3,因此可能要归咎于流类型识别。但为什么?
这里有 ffmpeg控制台输出 和 VLC日志 。
我究竟做错了什么?
PS:在这里从Stack Overflow移动这个问题,因为它没有得到任何答案,旧的未答复的副本被删除。
其他玩家收到它吗?
—
Gyan
哇噢!你完全走在正确的轨道上。我尝试了MPlayer和PotPlayer(这是一个名字)和PotPlayer可以玩它!问题仍然存在:为什么不是VLC?
—
GerbGerb
我明天会调查一下。
—
Gyan
更新:我也试过OpenCV(Python3)的VideoCapture。这会产生严重损坏的图像和大量的“解码时出错”。可能是VLC和OpenCV使用相同的解码器,这与h.264有问题吗?
—
GerbGerb
似乎与此有关: trac.videolan.org/vlc/ticket/21024 。降级VLC或使用其他玩家。
—
Gyan