使用 ffmpeg 降低帧率和比特率不起作用



我正在使用ffmpeg在rtsp流上流式传输树莓PI摄像头。

在我将此命令与OpenCV:结合使用之前

ffmpeg -re -c:v copy -preset ultrafast -tune zerolatency -rtsp_transport udp -f rtsp rtsp_server

它工作良好,但CPU使用率很高。

所以我发现有了这个命令

ffmpeg -input_format h264 -i /dev/video0 -c:v copy -an -rtsp_transport udp -f rtsp rtsp_server

我没有使用CPU,但在互联网上发送的数据量很高。

保存用最后一个命令捕获的视频,并使用mediainfo获取信息,它说:格式:AVI格式/信息:音频视频交错文件大小:2.52 MiB持续时间:17 s 783 ms总比特率:1 188 kb/s写作申请:Laff58.76.100

Video
ID                                       : 0
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings                          : CABAC / 1 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 1 frame
Format settings, GOP                     : M=1, N=60
Codec ID                                 : H264
Duration                                 : 17 s 783 ms
Bit rate                                 : 1 174 kb/s
Width                                    : 640 pixels
Height                                   : 480 pixels
Display aspect ratio                     : 4:3
Frame rate                               : 60.000 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.064
Stream size                              : 2.49 MiB (99%)

我试着用这个命令来降低帧速率和比特率:

ffmpeg -input_format h264 -i /dev/video0 -b:v 30k -framerate 30 -c:v copy -an video.avi

但它不起作用。

这是我保存视频时的ffmpeg输出:

ffmpeg -input_format h264 -i /dev/video0 -b:v 30k -framerate 30 -c:v copy -an video.avi
ffmpeg version a4e1dd6 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Raspbian 10.2.1-6+rpi1)
configuration: --extra-cflags='-I/usr/local/include -I/usr/include' --extra-ldflags='-L/usr/local/lib -L/usr/lib' --extra-libs='-lpthread -lm -latomic' --arch=armel --enable-gmp --enable-gpl --enable-libaom --enable-libass --enable-libdav1d --enable-libdrm --enable-libfdk-aac --enable-libfreetype --enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libvpx --enable-libzimg --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-mmal --enable-nonfree --enable-omx --enable-omx-rpi --enable-version3 --target-os=linux --enable-pthreads --enable-openssl --enable-hardcoded-tables
libavutil      56. 70.100 / 56. 70.100
libavcodec     58.134.100 / 58.134.100
libavformat    58. 76.100 / 58. 76.100
libavdevice    58. 13.100 / 58. 13.100
libavfilter     7.110.100 /  7.110.100
libswscale      5.  9.100 /  5.  9.100
libswresample   3.  9.100 /  3.  9.100
libpostproc    55.  9.100 / 55.  9.100
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 14575.131904, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 640x480, 30 fps, 30 tbr, 1000k tbn, 2000k tbc
Output #0, avi, to 'video.avi':
Metadata:
ISFT            : Lavf58.76.100
Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 640x480, q=2-31, 30 kb/s, 30 fps, 30 tbr, 60 tbn, 60 tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[avi @ 0x3044850] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
frame=    1 fps=0.0 q=-1.0 size=      28kB time=00:00:00.01 bitrate=13675.9kbi[avi @ 0x3044850] Non-monotonous DTS in output stream 0:0; previous: 0, current: 0; changing to 1. This may result in incorrect timestamps in the output file.
frame=   23 fps=0.0 q=-1.0 size=     202kB time=00:00:00.71 bitrate=2305.9kbitframe=   38 fps= 37 q=-1.0 size=     256kB time=00:00:01.21 bitrate=1723.7kbitframe=   53 fps= 35 q=-1.0 size=     256kB time=00:00:01.71 bitrate=1221.6kbitframe=   69 fps= 34 q=-1.0 size=     512kB time=00:00:02.25 bitrate=1864.1kbitframe=   84 fps= 33 q=-1.0 size=     512kB time=00:00:02.75 bitrate=1525.2kbitframe=   99 fps= 33 q=-1.0 size=     768kB time=00:00:03.25 bitrate=1935.8kbitframe=  114 fps= 32 q=-1.0 size=     768kB time=00:00:03.75 bitrate=1677.7kbitframe=  129 fps= 32 q=-1.0 size=    1024kB time=00:00:04.25 bitrate=1973.8kbitframe=  144 fps= 32 q=-1.0 size=    1024kB time=00:00:04.75 bitrate=1766.0kbitframe=  159 fps= 31 q=-1.0 size=    1280kB time=00:00:05.25 bitrate=1997.3kbitframe=  175 fps= 31 q=-1.0 size=    1280kB time=00:00:05.78 bitrate=1813.1kbitframe=  190 fps= 31 q=-1.0 size=    1536kB time=00:00:06.28 bitrate=2002.6kbitframe=  205 fps= 31 q=-1.0 size=    1536kB time=00:00:06.78 bitrate=1855.0kbitframe=  220 fps= 31 q=-1.0 size=    1792kB time=00:00:07.28 bitrate=2015.6kbitframe=  235 fps= 31 q=-1.0 size=    1792kB time=00:00:07.78 bitrate=1886.1kbitframe=  251 fps= 31 q=-1.0 size=    2048kB time=00:00:08.31 bitrate=2017.3kbitframe=  266 fps= 31 q=-1.0 size=    2048kB time=00:00:08.81 bitrate=1902.9kbitframe=  279 fps= 31 q=-1.0 Lsize=    2315kB time=00:00:09.25 bitrate=2050.6kbits/s speed=1.02x    
video:2297kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.816921%

有人能帮我缩小输出大小吗?

使用解决了v4l2的最大比特率设置问题

v4l2-ctl --set-ctrl video_bitrate=value_you_want

最新更新