ffmpeg二

[TOC]

FFMPEG常用命令

要掌握一些规律

基本信息查询命令

录制命令

分解/复用命令

处理原始数据命令

裁剪与合并命令

图片/视频转换命令

直播相关的命令

各种滤镜命令 可以加logo滤镜,删除滤镜

ffmpeg处理流程,

输入文件 - demuxer - 编码数据包 - decoder - 解码后数据帧-encoder-编码数据包-muxer-输出文件

纲举目张

muxer, demuxer封装,解封装。

bsfs处理bit流

pix_fmts rgb

帧内编码,帧间编码, 有损压缩,无损压缩

formats

录制命令

  1. ffmpeg录制屏幕:

    ffmpeg -f avfoundation -i 1-r 30 out.yuv
    -f : avfoundation采集数据
    -i: 指定从哪里采集数据,它是一个文件索引号 1是屏幕,0是摄像头

    -r:指定帧率

    ffplay out.yuv 来输出

ffmpeg -f avfoundation -i 1 -r 30 out.yuv
通过-f确定用什么来采集数据 可以通过查看ffmpeg -devices可以确定

1
2
3
D  avfoundation    AVFoundation input device
D lavfi Libavfilter virtual input device
E sdl,sdl2 SDL2 output device

-i 确定在哪里采集数据 1是屏幕 ,0是摄像头
-r 指定帧率
out.yuv是输出的文件名

ffplay -s 3360x2100 -pix_fmt uyvy422 out.yuv
通过ffplay来进行播放
-s 分辨率 activate frame-step mode
-pix_fmt 显示像素格式

ffmpeg -f avfoundation -list_devices true -i “” 设备索引号通过这个命令查看

查看当前选择的设备支持的类型,是语音呢还是什么

ffmpeg -f avfoundation -i :0 out.wav

:0表示是音频设备
在 : 前的是屏幕设备

ffmpeg -f avfoundation -i 1:0 out.yuv 音频和视频同时录制

分解与复用 : 文件格式转换

输入文件 - 分解 - 编码数据包 - 复用 - 输出文件

ffmpeg - i out.mp4 -vcodec copy -acodec copy out.flv
-i :输入文件
-vcodec :视频编码处理方式
-acodec:音频编码处理方式

ffmpeg -i zhou_v.mp4 -an -vcodec copy out.h264 //直接抽取视频

ffmpeg -i zhou_v.mp4 -acodec -vn out.aac //抽取音频

处理原理数据命令
原始数据:ffmpeg 解码的数据
视频 :yuv 数据
音频:pcm 数据

提取 yuv数据
//原始视频编码 指定像素格式 4:2:0 (常用) 4:4:4 4:2:2

ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv // 视频的原始数据

提取pcm 48k 38k 16k 单声道还是多声道 -f抽取音频pcm的数据存储格式 s16le 符号的 16位表示
Ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm // 音频的原始数据
ar 采样率

Ffplay -ar 44100 -ac 2 -f s16le out.pcm

原始数据,就可以操作一些反转,等一些视频处理

Ink 长刀 瘦金体

滤镜命令:视频倍速,等等 所有滤镜处理,都是对解码后的数据帧做处理

​ 视频滤镜命令 -vf 滤镜类型是 原来的宽度-200,原来的高度 -200 crop = in_w-200:in_h-200

Ffmpeg -i in.mov -vf crop = in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4

crop格式 : crop = out_w:out_h:x:y

加水印

ffmpeg -i zhou_v.mp4 -vf “drawtext=fontfile=simhei.ttf: text=’技术’:x=10:y=10:fontsize=24:fontcolor=white:shadowy=2” output.mp4

ffmpeg -i input.mp4 -i logo.png -filter_complex ‘overlay=main_w-overlay_w-10:main_h-overlay_h-10’ output.mp4

裁剪和合并命令

//从上面时间点开始裁剪 -t 是裁剪多次时间 以秒为单位

ffmpeg -i in.mp4 -ss 00:00:00 -t 10 out.ts

ffmpeg -f contact -i inputs.txt out.flv

直播流

推流
re和帧率同步

ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

拉流

ffmpeg -i rtmp://server/live/streamName -c copy dump.flv

m3u8

Njex推流

初级开发

日志怎么进行打,怎么使用

介绍ffmpeg的基本概念

对复用/解复用及流操作的各种实战

Ffmpeg 的代码结构

libavcodec 提供了一些列的解码器

libavformat 实现在流协议,容器格式及io基本访问

libavfilter 提供了各种音视频过滤器

libavdevice 提供访问捕获设备和回访设备的接口

libswresample 实现混音和重采样

libswscale 实现色彩转换和缩放功能


ffmpeg日志系统

include<libavutil/log.h>

av_log_set_level(AV_LOG_DEBUG)
av_log(NULL, AV_LOG_INFO, “… %s\n”, op)

AV_LOG_ERROR WARNING LOG_INFO

1
2
3
4
5
6
7
#include <stdio.h>
#include <libavutil/log.h>

int main() {
av_log_set_level(AV_LOG_DEBUG);
av_log(NULL, AV_LOG_INFO, "Hello world \n");
}

运行:

clang -g -o ffmpeg_log ffmpeg_log.c -lavutil

ffmpeg日志进行操作

  • 文件的删除与重命名

    avpriv_io_delete(“./mytestfile”)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <libavformat/avformat.h>

    int main(int argc,char* argv[]) {
    //是个url串,符合url串都可以认的
    int ret;
    ret = avpriv_io_delete("1.txt");
    if (ret < 0) {
    av_log(NULL, AV_LOG_ERROR, "fail \n");
    }
    }

avpriv_io_move(“11.txt”, “222.txt”)

pkg-config - - libs libavformat 能找到系统的 libavformat 的库的位置

//不是单引号是 ````` 1前面的那个符号

clang -g -o ffmpeg_del ffmpeg_f.c `pkg-config –libs libavformat`

vim学习

命令模式
拷贝、删除、粘贴等、通过i/a等间来进行切换到编辑模式

编辑模式

编辑文字

  • 创建文件:vim filename

  • 保存文件: :w

  • 关闭文件::q

    拷贝。粘贴、删除

    yy/yw

    p

    Dd/dw

    移动光标 h/j/k/l(这是小写的L)

    文件头gg
    文件尾G

    移动到行首 ^

    移动到行尾$

    按单词移动:向前w 2w 3w
    向后 b 2b 3b

    vim查找与替换:查找关键字: /关键字 命令模式下 n来进行向下查找 N向上查找

    查找与替换::%s/关键字/替换字/gc c 就是确定替换吗

    ​ //关键字 可以写正则表达式
    set number 来进行显示行号

21,24s/关键字/替换字/gc 按照行号来进行替换

分窗口::split/ vsplit 横/竖 用close来关闭
窗口间跳转: ww w(hjkl)

  • 操作目录重要函数

    avio_open_dir()
    avio_read_dir() 读取文件的信息
    avio_close_dir() 释放资源
    重要结构体
    AVIODirContext 操作目录的上下文 目录的信息存在这里,read的时候
    需要传这个 AVIODirContext进入
    当关闭的时候也要传,知道关闭那个文件
    AVIODirEntry:文件大小,文件信息
    实战:简单的ls命令

    vim C语言环境

  • 多媒体文件的基本概念(一)

    • 多媒体文件其实是个容器;可以放音频数据,字幕数据
    • 在容器里有很多流(stream/Track);流 和 轨 ; 音频数据和视频数据,这个两条不会交叉
    • 每种流式有不同的编码器编码的 ; aac,mp3 h264 h265
    • 在一个包中包含着一个或者多个帧。包可能一帧压缩数据,多个包组成流,然后就多个多媒体文件
    • 几个重要结构体
      • AVFormatContext 多个多媒体文件的桥梁,可以区分哪个多媒体
      • AVStream 可以读取流
      • AVPacket 多个包,可以通过解码器,解会原来的的数据
    • 解复用(打开容器) -> 获取流-> 数据包 (读取流中的数据包,可以存一个或多个压缩帧) -> 释放相关的资源
  • 打印音/视频信息

    视频帧数是多少等。

    av_register_all()

    avformat_open_input()/avformat_close_input 这个会根据文件的格式进行读取

    av_dump_format() //可以打印meta信息

SPS/PPS 是干啥的

帧与IDR帧的区别是啥?

Opengles 的知识估计是来不及了

抽取音频数据:

av_init_packet() //初始化

av_find_best_stream() //

av_read_frame/av_packet_unref()

fOpen(dst,”wb”);

特征码

//视频转图片

ffmpeg -i in.flv -r 1 -f image2 image-3%d.jpeg

//图片转视频

ffmpeg -i image-3%d.jpeg out.mp4

start Code

Sps/pps 是干啥的, 普通文件有一个这个就好了,会产生新的 屏幕分辨率一样,

改变分辨率的时候,都要把 sps和pps切换对应的

codec -> extradata , 在编码器的 extradata中获取

In->data + in->size 的是移动