使用 libx264 编解码器在 FFmpeg 中编码的视频无法在移动设备上按预期播放

Bru*_*o F 5 h.264 ffmpeg

我目前正在进行一个项目,抓取 IP 摄像机视频并将其流式传输到网站。该摄像机位于海滩,因此想法是将流信号发送到服务器,然后从服务器发送到客户端设备。

\n\n

为此,我在海滩上使用了 Raspberry Pi 3 B+,负责从相机获取信号并将其发送到服务器。

\n\n

I\xe2\x80\x99m 使用 FFmpeg 将 RTSP 信号转换为 HLS 片段,然后将它们存储在服务器上,然后使用 VideoJS 7.4.1 在浏览器中播放片段。

\n\n

这是我\xe2\x80\x99m 使用的 FFmpeg 中的代码:

\n\n
ffmpeg -i  rtsp://CameraIP/onvif1 -c:v libx264  -preset veryfast -crf 17 -an -hls_time 40 -hls_list_size 5 ftp://ServerIP/stream/abc.m3u8\n
Run Code Online (Sandbox Code Playgroud)\n\n

这工作得很好,但问题是,Raspberry 使用了大约 70% 的 CPU 使用率来执行此任务,因此我必须降低质量,好消息是相机信号已经是 h264 格式(说 h264本机)所以我尝试不将视频编解码器转换为 libx264,而是使用以下命令复制流:

\n\n
ffmpeg -i  rtsp://cameraIP/onvif1 -c:v copy -an -hls_time 40 -hls_list_size 5 ftp://ServerIP/stream/abc.m3u8\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用这个命令,CPU 使用率下降到 2% 或 3%,这很好,我可以提高质量,甚至更好,获得更好的相机。但问题是它不适用于手机(在 FireFix、Chrome 和 Safari 中尝试,在 Android 和 iO 操作系统中),VideoJS 显示此错误:

\n\n
\n

由于损坏问题或媒体使用的功能您的浏览器不支持,媒体播放被中止

\n
\n\n

所有浏览器都是最新的。

\n\n

这是复制视频编解码器的日志,没有使用编码器

\n\n
ffmpeg version 3.2.12-1~deb9u1+rpt1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516\n  configuration: --prefix=/usr --extra-version='1~deb9u1+rpt1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-omx-rpi --enable-mmal --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --arch=armhf --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared\n  libavutil      55. 34.101 / 55. 34.101\n  libavcodec     57. 64.101 / 57. 64.101\n  libavformat    57. 56.101 / 57. 56.101\n  libavdevice    57.  1.100 / 57.  1.100\n  libavfilter     6. 65.100 /  6. 65.100\n  libavresample   3.  1.  0 /  3.  1.  0\n  libswscale      4.  2.100 /  4.  2.100\n  libswresample   2.  3.100 /  2.  3.100\n  libpostproc    54.  1.100 / 54.  1.100\nGuessed Channel Layout for Input Stream #0.1 : mono\nInput #0, rtsp, from 'rtsp://CameraIP/onvif1':\n  Metadata:\n    title           : H.264 Video, RtspServer_0.0.0.2\n  Duration: N/A, start: 0.000000, bitrate: N/A\n    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, 15 tbr, 90k tbn, 180k tbc\n    Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s\n[hls @ 0xc52be0] Opening 'ftp://ServerIP/stream/abc0.ts' for writing\nOutput #0, hls, to 'ftp://ServerIP/stream/abc.m3u8':\n  Metadata:\n    title           : H.264 Video, RtspServer_0.0.0.2\n    encoder         : Lavf57.56.101\n    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, q=2-31, 15 tbr, 90k tbn, 90k tbc\nStream mapping:\n  Stream #0:0 -> #0:0 (copy)\nPress [q] to stop, [?] for help\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是将 h264 转换为 libx264 的 FFmpeg 日志

\n\n
ffmpeg version 3.2.12-1~deb9u1+rpt1 Copyright (c) 2000-2018 the FFmpeg developers built with gcc 6.3.0 (Raspbian 6.3.0-18+rpi1+deb9u1) 20170516\n  configuration: --prefix=/usr --extra-version='1~deb9u1+rpt1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-omx-rpi --enable-mmal --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --arch=armhf --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared\n  libavutil      55. 34.101 / 55. 34.101\n  libavcodec     57. 64.101 / 57. 64.101\n  libavformat    57. 56.101 / 57. 56.101\n  libavdevice    57.  1.100 / 57.  1.100\n  libavfilter     6. 65.100 /  6. 65.100\n  libavresample   3.  1.  0 /  3.  1.  0\n  libswscale      4.  2.100 /  4.  2.100\n  libswresample   2.  3.100 /  2.  3.100\n  libpostproc    54.  1.100 / 54.  1.100\nGuessed Channel Layout for Input Stream #0.1 : mono\nInput #0, rtsp, from 'rtsp://CameraIP/onvif1':\n  Metadata:\n    title           : H.264 Video, RtspServer_0.0.0.2\n  Duration: N/A, start: 0.000000, bitrate: N/A\n    Stream #0:0: Video: h264 (High), yuvj420p(pc, bt709, progressive), 1280x960, 15 tbr, 90k tbn, 180k tbc\n    Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s\nNo pixel format specified, yuvj420p for H.264 encoding chosen.\nUse -pix_fmt yuv420p for compatibility with outdated media players.\n[libx264 @ 0x814a50] using cpu capabilities: ARMv6 NEON\n[libx264 @ 0x814a50] profile High, level 3.2\n[hls @ 0x6addd0] Opening 'ftp://ServerIP/stream/abc0.ts' for writing\nOutput #0, hls, to 'ftp://ServerIP/stream/abc.m3u8':\n  Metadata:\n    title           : H.264 Video, RtspServer_0.0.0.2\n    encoder         : Lavf57.56.101\n    Stream #0:0: Video: h264 (libx264), yuvj420p(pc), 1280x960, q=-1--1, 15 fps, 90k tbn, 15 tbc\n    Metadata:\n      encoder         : Lavc57.64.101 libx264\n    Side data:\n      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1\nStream mapping:\n  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))\nPress [q] to stop, [?] for help\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以看来移动浏览器无法原生支持h264,必须将其转换为libx264,所以还有其他方法可以解决这个问题,也许是另一个与移动浏览器兼容的编码器?

\n

mwj*_*wjb 2

“未指定像素格式,选择了用于 H.264 编码的 yuvj420p。使用 -pix_fmt yuv420p 与过时的媒体播放器兼容。”

尝试将 -pix_fmt yuv420p 添加到您的命令中,看看这是否有助于播放兼容性。