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

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时,产生的图片序列如下:

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

 当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是通过创建重复帧来满足设置帧率的。

.mp4文件解码图像帧。

ffmpeg -i webwxgetvideo.mp4 -r 60 -q:v 5 -f image2 pic-%03d.jpeg

  

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$ 

抓取指定时间的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

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

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

参数解释如下:

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...

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

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

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

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

6.查看视频PTS

ffprobe -show_frames -select_streams v ffserver/test.mp4 

grep 后面换成pkt_dts即可查看DTS

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

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

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

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

 将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 -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

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

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

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

图片转换为YUV NV12格式

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

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对H264码流进行分析_papaofdoudou的博客-CSDN博客

FFMPEG硬解加速

ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i ./godfather.mkv -vcodec rawvideo -acodec copy -f matroska - | ffplay -i -


结束!

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值