利用ffmpeg对视频文件进行分析几例
  qUJOhJyC3pLU 2023年11月13日 21 0


1.将视频文件转换为jpg图片文件序列:

ffmpeg -i /home/czl/WorkSpace/ffmpeg/H264_REC.raw -r 1 -q:v 2 -f image2 pic-%03d.jpeg

​-q:v 2​​表示输出的图片质量,一般是1到5之间(1 为质量最高)

-r:图片采样率,帧率,表示每秒钟产生多少张.jpeg图片

czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r1$ ffmpeg -i /home/czl/WorkSpace/ffmpeg/H264_REC.raw -r 1 -q:v 2 -f image2 pic-%03d.jpeg
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, h264, from '/home/czl/WorkSpace/ffmpeg/H264_REC.raw':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt470bg/bt470bg/smpte170m, progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'pic-%03d.jpeg':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: mjpeg, yuvj420p(pc), 1920x1080, q=2-31, 200 kb/s, 1 fps, 1 tbn, 1 tbc
Metadata:
encoder : Lavc57.107.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 146 fps=3.4 q=2.0 Lsize=N/A time=00:02:26.00 bitrate=N/A dup=0 drop=3454 speed=3.42x
video:11299kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r1$

r=1时,产生的图片序列如下:

利用ffmpeg对视频文件进行分析几例_ubuntu

利用ffmpeg对视频文件进行分析几例_ide_02

第一张和第二张图片是不同的。

 当r=100的时候

czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r100$ ffmpeg -i /home/czl/WorkSpace/ffmpeg/H264_REC.raw -r 100 -q:v 2 -f image2 pic-%03d.jpeg
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, h264, from '/home/czl/WorkSpace/ffmpeg/H264_REC.raw':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt470bg/bt470bg/smpte170m, progressive), 1920x1080, 25 fps, 25 tbr, 1200k tbn, 50 tbc
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
Output #0, image2, to 'pic-%03d.jpeg':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: mjpeg, yuvj420p(pc), 1920x1080, q=2-31, 200 kb/s, 100 fps, 100 tbn, 100 tbc
Metadata:
encoder : Lavc57.107.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
More than 1000 frames duplicated/A time=00:00:13.08 bitrate=N/A dup=981 drop=0 speed=0.838x
More than 10000 frames duplicatedA time=00:02:13.24 bitrate=N/A dup=9993 drop=0 speed=0.813x
frame=14400 fps= 81 q=2.0 Lsize=N/A time=00:02:24.00 bitrate=N/A dup=10800 drop=0 speed=0.806x
video:1114416kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r100$

 生成了大量的图片:

利用ffmpeg对视频文件进行分析几例_ubuntu_03

第一张和第二张是相同的

利用ffmpeg对视频文件进行分析几例_ide_04

利用ffmpeg对视频文件进行分析几例_bc_05

所以,可以看出,ffmpeg是通过创建重复帧来满足设置帧率的。

2.抓取视频文件指定时间的图像:

czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r100$ ffmpeg -y -i /home/czl/WorkSpace/ffserver/test.mp4 -ss 00:00:24 -t 00:00:01 output_%3d.jpg
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/czl/WorkSpace/ffserver/test.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
creation_time : 2008-05-20T06:32:24.000000Z
Duration: 00:03:49.09, start: 0.000000, bitrate: 2205 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 223 kb/s (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1978 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
Stream mapping:
Stream #0:1 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x55ba854bc640] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'output_%3d.jpg':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
encoder : Lavf57.83.100
Stream #0:0(und): Video: mjpeg, yuvj420p(pc), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
encoder : Lavc57.107.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 25 fps=6.4 q=24.8 Lsize=N/A time=00:00:01.00 bitrate=N/A speed=0.254x
video:297kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r100$

利用ffmpeg对视频文件进行分析几例_bc_06

抓取指定时间的1帧图像:

ffmpeg -ss 00:00:10 -i /home/czl/WorkSpace/ffserver/test.mp4 -vframes 1 -q:v 2 output.jpg
czl@czl-VirtualBox:~/WorkSpace/ffmpeg/r100$ ffmpeg -ss 00:00:10 -i /home/czl/WorkSpace/ffserver/test.mp4 -vframes 1 -q:v 2 output.jpg
ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --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-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/czl/WorkSpace/ffserver/test.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
creation_time : 2008-05-20T06:32:24.000000Z
Duration: 00:03:49.09, start: 0.000000, bitrate: 2205 kb/s
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 223 kb/s (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1978 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
Stream mapping:
Stream #0:1 -> #0:0 (h264 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x56492b0a4e80] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'output.jpg':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isomavc1mp42
encoder : Lavf57.83.100
Stream #0:0(und): Video: mjpeg, yuvj420p(pc), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc (default)
Metadata:
creation_time : 2008-05-20T06:32:24.000000Z
handler_name : (C) 2007 Google Inc. v06.24.2007.
encoder : Lavc57.107.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: -1
frame= 1 fps=0.0 q=2.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.161x
video:71kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

利用ffmpeg对视频文件进行分析几例_linux_07

3.视频文件转换为GIF动图:

ffmpeg -ss 00:00:08 -t 5 -i test.mp4 -s 640x360 -r 15 dongtu.gif

利用ffmpeg对视频文件进行分析几例_linux_08

参数解释如下:

1. -ss 00:00:08 表示从第 00 分钟 08 秒开始制作 GIF,如果你想从第 9 秒开始,则输入 -ss 00:00:09,或者 -ss 9,支持小数点,所以也可以输入 -ss 00:00:11.3,或者 -ss 34.6 之类的,如果不加该命令,则从 0 秒开始制作;

2. -t 5 表示把持续 5 秒的视频转换为 GIF,你可以把它改为其他数字,例如 1.5,7 等等,时间越长,GIF 体积越大,如果不加该命令,则把整个视频转为 GIF;

3. -i 表示指定输入文件.

4. test.mp4 就是-i指定的你要转换的视频,名称最好不要有中文,不要留空格,支持多种视频格式.

5.  -s 640x360 是 GIF 的分辨率,视频分辨率可能是 1080p,但你制作的 GIF 可以转为 720p 等,允许自定义,分辨率越高体积越大,如果不加该命令,则保持分辨率不变.

7. -r 15 表示帧率,网上下载的视频帧率通常为 24,设为 15 效果挺好了,帧率越高体积越大,如果不加该命令,则保持帧率不变;

8. dongtu.gif, 就是你要输出的文件.

4.图片合并为动图:

ffmpeg -threads 2 -r 1 -i pic-%03d.jpeg output.gif -y
ffmpeg -threads 2 -r 2 -i %d.jpg 11.gif -y
-threads 2:2 以两个线程进行运行, 加快处理的速度。
-y 对输出文件进行覆盖
-r 1 fps设置为1帧/秒(不同位置有不同含义)
-i pic-%03d.jpeg 合并的图片文件,图片文件为 pic-001.jpeg pic-002.jpeg...

利用ffmpeg对视频文件进行分析几例_ubuntu_09

可见,通过帧率调整,输出的gif时间跳跃非常大。

5.查看视频运动向量信息:

ffplay -flags2 +export_mvs -ss 02 input.mp4  -vf codecview=mv=pf+bf+bb

利用ffmpeg对视频文件进行分析几例_ide_10

ffplay -flags2 +export_mvs gif/test.mp4 -vf codecview=mv=pf+bf+bb

利用ffmpeg对视频文件进行分析几例_ide_11

6.查看视频PTS

ffprobe -show_frames -select_streams v ffserver/test.mp4 

利用ffmpeg对视频文件进行分析几例_bc_12

grep 后面换成pkt_dts即可查看DTS

grep key_frame可以查看帧是否是关键帧

利用ffmpeg对视频文件进行分析几例_ubuntu_13

或者用如下命令PTS/DTS/Keyframe一起显示出来: 

ffmpeg -i ffserver/test.mp4 -dump -map 0:v -f null -

利用ffmpeg对视频文件进行分析几例_ubuntu_14

7.将PTS打印在画面上

ffmpeg -i ffserver/test.mp4 -vf drawtext=fontcolor=white:fontsize=30:fontfile=msyh.ttf:line_spacing=7:text=%{pts}:x=50:y=50 -vframes 600  -y out.mp4

利用ffmpeg对视频文件进行分析几例_bc_15

 将B/P/I帧信息打印到视频上:

ffmpeg -i ffserver/test.mp4 -vf drawtext=fontcolor=white:fontsize=20:fontfile=msyh.ttf:line_spacing=7:text=%{pict_type}:x=50:y=50 -vframes 600  -y out.mp4

利用ffmpeg对视频文件进行分析几例_ubuntu_16

显示帧数到屏幕上:

ffmpeg -i gif/test.mp4 -vf drawtext=fontcolor=white:fontsize=40:fontfile=msyh.ttf:line_spacing=7:text=%{n}:x=50:y=50 -vframes 600  -y out.mp4

利用ffmpeg对视频文件进行分析几例_linux_17

8:视频和图像叠加:

用leyla奶奶做背景,将视频叠加上去

ffmpeg -i out.png -i gif/test.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv

利用ffmpeg对视频文件进行分析几例_bc_18

9:TCP推流

先启动接收端

ffmpeg -listen 1 -f flv -i tcp://127.0.0.1:1234/live/stream -c copy -f mp4 ouput.mp4

再启动发送端:

ffmpeg -re -i /home/caozilong/Workspace/manim/manim/media/videos/manim_tutorial_P37/480p15/MovingShapes.mp4 -c copy -f flv tcp://127.0.0.1:1234/live/stream

顺序不能反,反的化命令会执行失败

利用ffmpeg对视频文件进行分析几例_linux_19

图片转换为YUV NV12格式

ffmpeg -i dog_416x416.jpg -pix_fmt nv12 image_416x416.nv12.yuv

利用ffmpeg对视频文件进行分析几例_ide_20

ffmpeg截取视频:

ffmpeg  -i ./video.mp4 -vcodec copy -acodec copy -ss 00:00:00 -to 00:00:05 ./cutout1.mp4 -y

ffmpeg转录裸流视频:

ffmpeg -i test.mp4 -codec copy -bsf: h264_mp4toannexb  output.h264

可以看到,转录的裸流的前面两个比数据都分别是PPS和SPS,根据0X68,0X67的NALU ID即可识别出来。

利用ffmpeg对视频文件进行分析几例_bc_21

利用ffmpeg对视频文件进行分析几例_bc_22

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
qUJOhJyC3pLU