无法使用 Android 上的 ExoPlayer 或 Mac 上的 Quicktime 从网络摄像头播放 MPEG-TS

Cannot play MPEG-TS from webcam using ExoPlayer on Android or Quicktime on Mac

我正在尝试使用 FFmpeg 将我的网络摄像头流式传输到基于 HttpLiveStreaming(HLS) 的 Android 设备。为了在 Android 上播放 MPEG-TS,我使用了 ExoPlayer。


FFmpeg 流媒体命令:ffmpeg -f avfoundation -video_size 1280x720 -framerate 30 -i "0" -vcodec libx264 -preset veryfast -f flv rtmp://localhost:1935/hls/test

当我用VLC播放MPEG-TS时,一切正常。但是,我无法使用 Android 上的 ExoPlayer 或 Mac OS 上的 Quicktime(Safari) 播放它。然后我试着找出原因。


我尝试以同样的方式使用 FFmpeg 流式传输 mp4 视频。例如:ffmpeg -re -i test.mp4 -vcodec libx264 -preset veryfast -f flv rtmp://localhost:1935/hls/test

我可以使用 ExoPlayer 和 Quicktime 播放它。


我发现这两种情况的唯一区别是网络摄像头的捕获格式是 YUY2,而 mp4 视频是 YUV420,并且它们使用不同的 H264 编码器。我猜 YUY2 和 YUV420 的 H264 解码器不一样。

我不确定我的推断是否正确,解决这个问题的唯一方法是在流式传输之前将 YUY2 转换为 YUV420。

我希望使用 Mac 的人可以尝试使用与我相同的方式流式传输 Facetime 相机,看看它是否可以在 Safari 中播放。

终于,我找到了解决办法。正如我推断的那样,在H264编码和流媒体之前,我需要将YUY2转换为YUV420。 所以命令应该是ffmpeg -f avfoundation -pix_fmt uyvy422 -video_size 1280x720 -framerate 30 -i "0" -pix_fmt yuv420p -vcodec libx264 -preset veryfast -f flv rtmp://localhost:1935/hls/test

感谢this