0%

FFmpeg的简单使用

1. 安装

  • 在FFmpeg的下载页面下载需要的版本,目前有Linux、Windows、MacOS版本 & Source code
  • 下载传送门:
    • 官网:https://ffmpeg.org/download.html
    • Github: https://github.com/FFmpeg/FFmpeg

  • 编译安装后,如果发现没有 ffplay ,一般是缺少 sdk 共享库
  • 通过这条命令安装:sudo apt-get install libsdk1.2-dev libsdk2-dev

Simple Use

  • 从源代码进行构建:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sudo apt install yasm
    #***下载最新版release,假设下载后的release名称为:n4.0.1***
    name=n4.0.1
    tar -xvf $name
    cd ffmpeg
    ./configure --enable-x264
    #如果有问题,直接 ./configure
    core=`cat /proc/cpuinfo| grep "processor"| wc -l`
    sudo make -j $core && sudo make install

Deep Customization

  1. 进入源代码根目录,使用 ./configure --help 查看所有参数和信息
  2. 选择开启格外的功能 --enable-***, 开启之前一般需要安装对应的 *lib
  3. 如启用 hevc (H265) 支持, 我们可以这样 sudo apt search x265, 然后根据返回的结果自行判断。一般需要安装的共享库的名称规范是:lib***-dev***-dev 。如 x265 就是 libx265-dev , 通过 sudo apt-get install libx265-dev 进行安装
  4. 对于想要开启 NVIDIA 硬解支持的话,按照 以下方法
    1. 确保自己有 NVIDIA显卡 ,而且 支持硬解码
    2. 安装 cuda (推荐最新版), 选完对应版本后在 Download 那边有安装说明。 传送门…
    3. 安装 Video Codec SDK
      1. git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
      2. cd nv-codec-headers && sudo make install && cd –
    4. nvcc 添加到 PATH
    5. 可以在 ./configure 后面添加 --prefix={dir} 来指定安装目录
    6. ./configure --enable-cuda-nvcc --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64
  • 通过 APT 源进行安装的 ffmpeg 默认参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@ubuntu:~# ffmpeg
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --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
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'
root@ubuntu:~#

2. 介绍

从源代码编译后,会安装 ffmpegffprobeffplay

  • ffmpeg 主要用于转码
  • ffprobe 主要用于查看媒体文件信息
  • ffplay 不仅仅是播放器,同时也是测试 ffmpegcodec 引擎、format 引擎、filter 引擎的工具,并且还可以进行可视化的媒体参数分析

3. 使用

1. 初级部分

1. 音视频文件转 MP4: ffmpeg -i input.flv -c copy -f mp4 output.mp4
2. 音视频文件转 FLV: ffmpeg -i input.mp4 -c copy -f flv output.flv

若音频有问题或者封装出错,尝试:ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv

3. 提取音视频文件里面的AAC音频流: ffmpeg -i input.mp4 -vn -acodec copy output.aac
4. FFmpeg 输出MP3: ffmpeg -i INPUT -acodec libmp3lame -b:a 320k output.mp3
5. 提取音视频文件里面的H.264视频流: ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
6. 使用AACH.264文件生成mp4文件: ffmpeg -i input.aac -i input.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f mp4 output.mp4
7. 对音频文件的编码做转换: ffmpeg -i input.wav -acodec libfdk_aac output.aac
8. 添加srt格式的字幕: ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
9. 从现有视频文件中抽离字幕并且烧录进新的视频中:ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi
10. 添加ass格式的字幕:ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi 或者你可以先将srt转换成ass格式:ffmpeg -i subtitle.srt subtitle.ass
11. 添加idx/sub格式的字幕: ffmpeg -i 1.mp4 -i 1.sub -i 1.idx -filter_complex "[0:v][2:s]overlay=0:H-h" -c:v libx264 out.mp4

这个会将图片类型的sub/idx格式字幕烧录进视频文件中。

2. 高级部分


Advance: FFmpeg 流媒体
-re: 实时推送


8. 录制 & 发布 RTMP
  1. 发布RTMP流: ffmpeg -i input.mp4 -c copy -f flv rtmp://localhost/live/class

    live 为发布点,class 为流名称
    自定义发布点为 live1、流名称为 class1,并且实时推流
    ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live1 -rtmp_playpath class1 rtmp://localhost 1. 录制RTMP流: ffmpeg -i rtmp://localhost/live/class -c copy -f flv output.flv

9. 录制 HTTP
  1. FLV直播流: ffmpeg -i http://localhost/live.flv -c copy -f flv output.flv
  2. TS直播流: ffmpeg -i http://localhost/live.ts -c copy -f flv output.flv
  3. HLS直播流: ffmpeg -i http://localhost/live.m3u8 -c copy -f flv output.flv
  4. 设置 http headers & user_agent & seekable 等参数 : ffmpeg -ss 300 -seekable 1 -user_agent "CC's Player" -headers "referer: http://localhost/index.html" -i http://localhost/live/class.flv -c copy -f flv -y ouput.flv
10. 录制 & 发布 TCP/UDP
  1. 发布TCP流: ffmpeg -re -i input.mp4 -c copy -f flv tcp://127.0.0.1:123/live/stream

    设置缓冲区为 4096 bit:ffmpeg -re -i input.mp4 -c copy -send_buffer_size 4096 -f flv tcp://127.0.0.1:123/live/stream

  2. 录制TCP流: ffmpeg -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv

    设置监听端口超时 listen_timeout (5秒): ffmpeg -listen_timeout 5000 -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv
    设置TCP流拉取超时参数 timeout (200秒):ffmpeg -timeout 20000000 -listen 1 -f flv -i tcp://127.0.0.1/live/stream -c copy -f flv output.flv

  3. 发布UDP流:ffmpeg -re -i input.mp4 -c copy -localport 23456 -f flv udp://127.0.0.1:123/live/stream

    使用FFmpeg的UDP传输数据时,默认会由系统分配本地端口,使用localport可以设置监听本地端口,抓包可以看到有一个 23456 -> 123 的端口转发


    Advance: FFmpeg 桌面录制


11. Windows桌面 录制
参数作用
draw_mouse是否采集鼠标指针
show_region是否绘制采集边界
framerate设置视频帧率,默认25帧,两个标准值为pal、ntsc
video_size设置视频分辨率
offset_x采集区域偏移x个像素
offset_y采集区域偏移x个像素
  • 整个桌面(设定帧率为60):./ffmpeg.exe -f gdigrab -framerate 60 -i desktop output.mp4
  • 某个窗口(假设窗口名为ffmpeg):./ffmpeg.exe -f gdigrab -framerate 60 -i title=ffmpeg output.mp4
  • 录制带偏移量的视频:./ffmpeg.exe -f gdigrab -framerate 60 -offset_x 50 -offset_y 50 -video_size 400x400 -i title=ffmpeg output.mp4
-------------本文结束再接再厉-------------

本文标题:FFmpeg的简单使用

文章作者:IITII

发布时间:2019年02月01日 - 12:02

最后更新:2019年08月13日 - 10:08

原始链接:https://iitii.github.io/2019/02/01/FFmpeg%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。