我正在尝试让 VLC 识别来自stdin
管道的 ffmpeg libx264 h.264 输出。
我有一个原始 RGB24 视频源(当前是一个文件,但最终会实时从应用程序获取),我希望使用 ffmpeg 对其进行 h.264 编码,然后将其导入 VLC 以通过 HTTP 作为 MJPEG 流提供。如果我使用 OMX 硬件编码器,我可以让它工作,但我的应用程序正在修改来自 Raspberry Pi 相机的帧,因此它将与硬件编码器绑定。由于 MMAL 管道的工作方式,我的应用程序在处理帧时无法输出 h.264。这意味着我必须在原始帧上使用 ffmpeg libx264 编码器。(不幸的是,根据 VLC 上的多路复用器列表流媒体功能页面,VLC 无法从原始输入生成 MJPEG。)
这是我的 VLC 命令,我知道它可以正常工作。我可以使用程序中的 h.264 输出将其驱动到stdin
,或使用cat
将原始 h.264 文件传输到 。我可以通过 在我的 LAN 上连接到它http://raspberrypi.local:8554/
。为便于阅读添加了换行符:
cvlc stream:///dev/stdin --sout '#transcode{
vcodec=mjpg,vb=2500,fps=24,acodec=none}
:standard{access=http{mime=multipart/x-mixed-replace;
boundary=7b3cc56e5f51db803f790dad720ed50a},
mux=mpjpeg,dst=:8554/}' :demux=h264
ffmpeg 命令生成一个有效的 h.264 文件(我已将样本转码为 MP4),但 VLC 不喜欢它(无论是当我通过管道传输文件时stdin
还是当我cat
通过管道传输文件时)。此外,为了便于阅读,还添加了换行符:
ffmpeg -hide_banner
-f rawvideo -c:v rawvideo -pix_fmt rgb24 -s:v 640x480 -r 24 -i -
-f h264 -c:v libx264 -preset ultrafast -tune zerolatency -
为了从终端进行测试,我仅cat /media/ramdisk/output.raw | ffmpeg... | vlc...
使用上面的两个命令行。
如前所述,我不能使用 OMX,但如果 ffmpeg 输出配置如下,一切正常。我知道 OMX 输出质量要低得多,但我不明白它在其他方面有何不同,也不知道 libx264 开关可能会产生有效的输出。
-f h264 -c:v h264_omx -b:v 2500k
我已经针对两个编码器的输出运行了 mediainfo,尽管我不知道其中大部分含义是什么。
libx264:
General
Complete name : /media/ramdisk/libx264.h264
Format : AVC
Format/Info : Advanced Video Codec
File size : 1.43 MiB
Writing library : x264 core 155 r2917 0a84d98
Encoding settings : cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia / subme=0 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=6 / threads=4 / lookahead_threads=4 / sliced_threads=1 / slices=4 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=24 / scenecut=0 / intra_refresh=0 / rc=crf / mbtree=0 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=0
Video
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:4:4 Predictive@L3
Format settings : 1 Ref Frames
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Width : 640 pixels
Height : 480 pixels
Display aspect ratio : 4:3
Frame rate : 24.000 FPS
Chroma subsampling : 4:4:4
Bit depth : 8 bits
Scan type : Progressive
Writing library : x264 core 155 r2917 0a84d98
Encoding settings : cabac=0 / ref=1 / deblock=0:0:0 / analyse=0:0 / me=dia / subme=0 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=6 / threads=4 / lookahead_threads=4 / sliced_threads=1 / slices=4 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=24 / scenecut=0 / intra_refresh=0 / rc=crf / mbtree=0 / crf=23.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=0
OMX:
General
Complete name : /media/ramdisk/h264_omx.h264
Format : AVC
Format/Info : Advanced Video Codec
File size : 2.39 MiB
Video
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L4
Format settings : CABAC / 1 Ref Frames
Format settings, CABAC : Yes
Format settings, ReFrames : 1 frame
Format settings, GOP : M=1, N=12
Width : 640 pixels
Height : 480 pixels
Display aspect ratio : 4:3
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
答案1
在研究了 mediainfo 输出一段时间后,答案很简单,只需通过添加此开关将 libx264 输出更改为 yuv420p:
-vf format=yuv420p