• Oh, my FFmpeg!


    常识介绍

    容器

    人们谈论的视频文件格式其实就是容器格式。
    媒体文件是既包括视频又包括音频、甚至还带有脚本的一个集合,因此被称为容器。

    常见的流媒体技术的相关容器:

    .ts  HLS技术下的视频切片容器
    .flv HTTP+flv技术
    

    音频视频编码

    音频视频编码方案有很多,用百家争鸣形容不算过分,目前常见的音频视频编码有以下几类:

     MPEG
     H.26X 系列:(由 ITU 国际电传视讯联盟 主导,侧重网络传输,注意:只是视频编码)
    

    目前主要的视频压缩协议有:

    h.261 、 h.263 、 h.264 和 mpeg 1 、 mpeg 2 和 mpeg 4 。
    

    音频协议也分两大类,itu 组织的主要是用于视频会议的 g 系列协议,以及更为人熟知一些的 iso 的音频:

    mp3 ,它的全称是 mpeg 1 audio layer 3 ,意思是 mpeg 1 的音频第三层;
    aac ,最新的音频算法(也称为 mp4 ),它定义在 mpeg 2 或 mpeg 4 的音频部分。
    
    特点:音质好,支持多声道,高采样精度和采样频率,尤其对音乐的压缩效果比 g 系列要好太多。
    

    h.264

    h.264是 iso 和 itu 两大组织共同制定的最新的算法成果,它在算法层面应该说是非常先进了,有人评价, h.264 是视频压缩技术的一个里程碑,在可预见的 5 到 10 年内,出现新的视频压缩协议可能性很小,除非压缩理论有重大突破。
    OBS视频推流协议就是h.264,当然,有软件(x264)和硬件的区分。

    h264_nvenc使用NVidia硬件辅助的H.264视频编码器。libx264是基于软件(CPU)的H.264编码器。
    猜想在相同的比特率下,libx264的质量比h264_nvenc好。
    h264_nvenc可能更快并且使用更少的功率。h264_nvenc仅在NVIDIA硬件上可用。
    

    基本参数介绍

    -hide_banner

    禁止输出构建配置configuration等信息。

    -re

    -re标志表示以本地帧速率读取输入。主要用于模拟抓取设备。
    例如,如果您要流式传输视频文件,则要使用它,否则它可能会流式传输太快(默认情况下,它尝试以线速流式传输)。我的猜测是,从实时设备流式传输时,您通常不希望使用此标志。

    -i

    指定audio/video输入。可以是本地文件路径,也可以是URL。

    ffmpeg -i file.mp4
    

    -f

    指定封装容器格式。如果输出是带后缀的文件名,那么可以忽略该参数。

    ffmpeg -i file.mp4 -f flv
    

    -c copy

    保留原始编码方式。

    ffmpeg -i file.mp4 -f flv -c copy
    

    -stream_loop -1

    设置循环播放次数,-1表示无限循环。该参数必须于-i参数之前提供。

    ffmpeg -stream_loop -1 -i file.mp4 -f flv -c copy
    

    输出

    ffmpeg -stream_loop -1 -i file.mp4 -f flv -c copy rtmp://localhost/live/<NAME>
    

    重新编码,-c:(v/a)

    -vcodec,简写为-c:v

    ffmpeg -i input.mp4 -c:v h264 -f flv out.flv
    
    ffmpeg -i input.mp4 -c:v h264_nvenc -f flv out.flv #使用N卡硬解,实测文件体积较大,探测结果为Stream #0:0: Video: h264 (Main)
    

    -acodec,简写为-c:a

    ffmpeg -i file.avi -vn -c:a aac out.mp4 #仅提取音频,并重新编码为mp4
    

    限制码率,-b:(v/a)

    指定码率

    ffmpeg -i input.mkv -c:a copy -c:v copy -b:v 600k out.mkv #错误,-c:v copy导致-b:v被忽略,文件未经处理
    ffmpeg -i input.mkv -c:a copy -b:v 600k out.mkv
    

    压缩前:

    Duration: 00:05:08.82, start: -0.007000, bitrate: 1130 kb/s
    

    压缩后:

    Duration: 00:05:08.82, start: -0.007000, bitrate: 766 kb/s
    

    动态码率,-qscale 2

    ffmpeg -i input.mkv -c:a copy -qscale 2 out.mkv
    
    Duration: 00:05:08.82, start: -0.007000, bitrate: 956 kb/s
    

    Video options:

    -vframes number     set the number of video frames to output
    -r rate             set frame rate (Hz value, fraction or abbreviation)
    -s size             set frame size (WxH or abbreviation)
    -aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
    -bits_per_raw_sample number  set the number of bits per raw sample
    -vn                 disable video
    -vcodec codec       force video codec ('copy' to copy stream)
    -timecode hh:mm:ss[:;.]ff  set initial TimeCode value.
    -pass n             select the pass number (1 to 3)
    -vf filter_graph    set video filters
    -ab bitrate         audio bitrate (please use -b:a)
    -b bitrate          video bitrate (please use -b:v)
    -dn                 disable data
    

    Audio options:

    -aframes number     set the number of audio frames to output
    -aq quality         set audio quality (codec-specific)
    -ar rate            set audio sampling rate (in Hz)
    -ac channels        set number of audio channels
    -an                 disable audio
    -acodec codec       force audio codec ('copy' to copy stream)
    -vol volume         change audio volume (256=normal)
    -af filter_graph    set audio filters
    

    RTMP推流

    须知

    RTMP 协议只可以使用 AMF 与 FLV 流容器。

    ffmpeg -stream_loop -1 -i out.mkv -f flv -c:v copy -b:v 600 rtmp://localhost:1935/live/STREAM_NAME
    

    对flv流重新编码后再推流:

    ffmpeg -i http://localhost:8000/live/a.flv -c:a aac -c:v h264 -f flv rtmp://localhost/live/b
    

    FLV关键帧索引

    -flvflags add_keyframe_index
    

  • 相关阅读:
    页式管理
    Chord算法(原理)
    php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)
    js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)
    js进阶ajax基本用法(创建对象,连接服务器,发送请求,获取服务器传过来的数据)
    js进阶课程ajax简介(ajax是浏览器来实现的)
    php面试题四
    heredoc(实现模板与代码的分离)
    如何查看计算机所连接的打印机
    php面试题三
  • 原文地址:https://www.cnblogs.com/develon/p/14251164.html
Copyright © 2020-2023  润新知