我正在使用 stdout (管道格式:管道<-Y<-U<-V 每个整个帧)从 C++ 程序内部将原始 YUV444 640x480 帧传输到 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 移到这里,旧的未答复的重复问题已被删除。
答案1
虽然根本问题尚未解决,但@Gyans 的提示帮助我解决了问题。使用其他播放器(PotPlayer)或旧版本的 VLC 使流显示正常工作,这就是我所需要的。