火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 5266|回复: 24
打印 上一主题 下一主题

[类库封装] 火山PCffmpeg模块+例子

[复制链接]

30

主题

116

帖子

2084

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
2084
跳转到指定楼层
楼主
发表于 2022-6-30 08:02:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
因广大用户需求,特封装PC版ffmpeg,安卓版的见以下帖子:

火山安卓ffmpeg类库+例子 重磅开源!!! - 火山平台俱乐部 - 火山软件开发平台 - Powered by Discuz! (voldp.com)


以下是PCffmpeg开发文档:
# 前言
FFmpeg多媒体库支持的命令行调用分为三个模块:ffmpeg、ffprobe、ffplay。<br>
其中ffmpeg命令行常用于音视频剪切、转码、滤镜、拼接、混音、截图等;<br>
ffprobe用于检测多媒体流格式;ffplay用于播放视频,包括本地与网络视频。<br>
详情可查阅FFmpeg官方文档:[ffmpeg Documentation](https://ffmpeg.org/documentation.html)<br>
更详细命令行处理可查看博客:[FFmpeg命令行汇总](https://blog.csdn.net/u011686167/article/details/120879467)<br>

# 一、ffmpeg命令行
## 1、命令行参数介绍

| Print help/info:   | Description                    |
|:-------------------|:-------------------------------|
| --help topic       | show help                      |
| -version           | show version                   |
| -formats           | show available formats         |
| -muxers            | show available muxers          |
| -demuxers          | show available demuxers        |
| -devices           | show available devices         |
| -codecs            | show available codecs          |
| -decoders          | show available decoders        |
| -encoders          | show available encoders        |
| -protocols         | show available protocols       |
| -filters           | show available filters         |
| -pix_fmts          | show available pixel formats   |
| -sample_fmts       | show available sample formats  |
| -hwaccels          | show available HW acceleration |

| Global options:    | Description                    |
|:-------------------|:-------------------------------|
| -v loglevel        | set logging level              |
| -y                 | overwrite output files         |
| -n                 | never overwrite output files   |
| -filter_threads    | number of filter threads       |
| -vol volume        | change audio volume(256=normal)|

| main options:      | Description                    |
|:-------------------|:-------------------------------|
| -f fmt             | force format                   |
| -c codec           | codec name                     |
| -codec codec       | codec name                     |
| -t duration        | duration seconds of audio/video|
| -to time_stop      | record or transcode stop time  |
| -ss time_off       | set the start time offset      |
| -frames number     | set the number of frames       |
| -discard           | discard                        |
| -disposition       | disposition                    |

| Video options:     | Description                    |
|:-------------------|:-------------------------------|
| -vframes number    | set the number of video frames |
| -r rate            | set frame rate (Hz value)      |
| -s size            | set frame size                 |
| -aspect aspect     | set aspect ratio (4:3, 16:9)   |
| -vn                | disable video                  |
| -vcodec codec      | force video codec              |
| -vf filter_graph   | set video filters              |
| -ab bitrate        | audio bitrate (please use -b:a)|
| -b bitrate         | video bitrate (please use -b:v)|

| Audio options:     | Description                    |
|:-------------------|:-------------------------------|
| -aframes number    | set the number of audio frames |
| -aq quality        | set audio quality              |
| -ar rate           | set audio sampling rate (in Hz)|
| -ac channels       | set number of audio channels   |
| -an                | disable audio                  |
| -acodec codec      | force audio codec              |
| -vol volume        | change audio volume(256=normal)|
| -af filter_graph   | set audio filters              |

命令行整体格式:以ffmpeg开头,参数之间用空格隔开,每个参数key以"-"开头,后面跟着参数value,输出文件放在命令行最后。<br>

## 2、音频常见操作
### 2.1 音频转码
直接转码:<br>
ffmpeg -i input.mp3 output.m4a<br>
指定编码器、采样率、声道数转码:<br>
ffmpeg -i input.mp3 -acodec aac -ac 2 -ar 44100 output.m4a<br>

### 2.2 音频剪切
-ss 10指定从第10秒开始,-t 20代表剪切20秒<br>
ffmpeg -i input.mp3 -ss 10 -t 20 cut.mp3<br>

### 2.3 音频拼接
ffmpeg -i concat:"hello.mp3|world.mp3" -acodec copy -vn concat.mp3<br>

### 2.4 音频混音
使用amix,参数inputs代表输入流个数,duration有longest、shortest、first三种模式,weights设置每条流音量权重占比:<br>
ffmpeg -i hello.mp3 -i world.mp3 -filter_complex amix=inputs=2:duration=first -vn mix.mp3<br>
使用amerge,合并成多声道输出:<br>
ffmpeg -i hello.mp3 -i world.mp3 -filter_complex [0:a][1:a]amerge=inputs=2[aout] -map [aout] merge.mp3<br>

### 2.5 空灵音效
aecho接收4个参数:in_gain (0, 1];out_gain (0, 1];delays (0 - 90000];decays (0 - 1.0]<br>
ffmpeg -i input.mp3 -af aecho=0.8:0.8:1000:0.5 echo.mp3<br>

### 2.6 惊悚音效
tremolo接收2个参数:frequency [0.1, 20000.0];depth (0, 1]<br>
ffmpeg -i input.mp3 -af tremolo=5:0.9 tremolo.mp3<br>

### 2.7 搞笑音效
搞笑音效通过调节音速实现,使用atempo:<br>
ffmpeg -i input.mp3 -filter_complex atempo=0.5 atempo.mp3<br>

### 2.8 静音检测
ffmpeg -i input.mp3 -af silencedetect=noise=0.0001 -f null -<br>

### 2.9 修改音量
ffmpeg -i input.mp3 -af volume=0.5 volume.mp3<br>

### 2.10 抽取音频
从视频抽取音频,直接disable视频流:<br>
ffmpeg -i input.mp4 -vn out.mp3<br>
从视频抽取音频,disable视频流,音频进行转码:<br>
ffmpeg -i input.mp4 -acodec aac -vn out.m4a<br>
从视频抽取音频,如果存在多音轨,可指定某个音轨:<br>
ffmpeg -i input.mp4 -map 0:1 -vn out.mp3<br>

## 3、视频常见操作
### 3.1 视频剪切
基本剪切,指定起始时间、剪切时长:<br>
ffmpeg -i input.mp4 -ss 10 -t 20 -codec copy cut.mp4<br>
精确剪切,包含多音轨,-map 0代表所有track流进行剪切,-accurate_seek代表精确seek:<br>
ffmpeg -i input.mp4 -ss 10 -accurate_seek -t 20 -map 0 -codec copy cut.mp4<br>

### 3.2 视频转码
使用-vcodec指定视频编码,-acodec指定音频编码,-s 640x480指定视频分辨率,<br>
-b 200k指定码率,-r 20指定帧率,这样达到视频压缩效果:<br>
ffmpeg -i input.mp4 -vcodec libx264 -acodec aac -s 640x480 -b 200k -r 20 transcode.mp4<br>

### 3.3 视频截图
使用-vframes指定截图数量,-ss指定起始时间放在-i前面,这样保证先seek到指定位置再截图。<br>
如果是先-i指定输入文件再-ss,是从时间0开始解码,直到指定时间再截图,这样效率太低:<br>
ffmpeg -ss 10 -i input.mp4 -f image2 -vframes 1 -an screenshot.jpg<br>

### 3.4 图片水印
使用-filter_complex指定位置overlay=x:y,如下所示:<br>
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=10:20 pic_watermark.mp4<br>
如果要灵活设置左上角、右上角、左下角、右下角位置,可以使用case语句,其中main_w代表视频宽度,<br>
main_h代表视频高度,overlay_w代表水印宽度,overlay_h代表水印高度:<br>
```
public static String obtainOverlay(int offsetX, int offsetY, int location) {
    switch (location) {
        case 2:
            return "overlay='(main_w-overlay_w)-" + offsetX + ":" + offsetY + "'";
        case 3:
            return "overlay='" + offsetX + "main_h-overlay_h)-" + offsetY + "'";
        case 4:
            return "overlay='(main_w-overlay_w)-" + offsetX + "main_h-overlay_h)-" + offsetY + "'";
        case 1:
        default:
            return "overlay=" + offsetX + ":" + offsetY;
    }
}

public static String[] addWaterMarkImg(String inputPath, String imgPath, int location,
                                           int offsetXY, String outputPath) {
    String overlay = obtainOverlay(offsetXY, offsetXY, location);
    String waterMarkCmd = "ffmpeg -i %s -i %s -filter_complex %s -preset:v superfast %s";
    waterMarkCmd = String.format(waterMarkCmd, inputPath, imgPath, overlay, outputPath);
    return waterMarkCmd.split(" ");
}
```
### 3.5 GIF水印
使用-ignore_loop 0代表GIF循环显示,其他操作与图片水印一致:<br>
ffmpeg -i input.mp4 -ignore_loop 0 -i logo.gif -filter_complex overlay=10:20 gif_mark.mp4<br>

### 3.6 去除水印
使用delogo命令,然后指定水印位置:<br>
ffmpeg -i input.mp4 -filter_complex delogo=x=10:y=20:w=90:h=30 delogo.mp4<br>

### 3.7 视频拼接
视频拼接分为垂直拼接、水平拼接,还有前后拼接,这里主要介绍垂直与水平拼接,其中使用hstack做水平拼接,vstack做垂直拼接:<br>
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex hstack out.mp4<br>

### 3.8 视频翻转
使用reverse实现视频翻转,但是处理比较耗时:<br>
ffmpeg -i input.mp4 -vf reverse -an output.mp4<br>

### 3.9 视频降噪
使用-nr代表noise reduction,进行视频降噪:<br>
ffmpeg -i in.mp4 -nr 500 out.mp4<br>

### 3.10 视频抽帧
ffmpeg -ss 20 -accurate_seek -t 10 -i input.mp4 -an -r 5 %3d.jpg<br>

### 3.11 播放速度
使用setpts设置视频速度,atempo设置音频速度:<br>
ffmpeg -i in.mp4 -filter_complex [0:v]setpts=%.2f*PTS[v];[0:a]atempo=%.2f[a] -map [v] -map [a] out.mp4<br>

### 3.12 黑白视频
ffmpeg -i in.mp4 -vf lutyuv='u=128:v=128' out.mp4

# 二、ffplay命令行
ffplay主要用于播放视频,也可以播放网络流,示例如下:<br>
ffplay -i beyond.mp4<br>

# 三、ffprobe命令行
ffprobe主要用于检测多媒体信息,包括时长、视频分辨率、帧率、音频采样率、声道数、每个stream流信息等等。<br>
支持显示形式包括:json和xml,例如-print_format json<br>
ffprobe -i input.mp4 -show_streams -show_format -print_format json<br>

如果要显示每帧数据信息,使用-show_frames可以显示pts、packet_size、duration、frame_type等信息:<br>
ffprobe -i input.mp4 -show_frames<br>

如果只要显示视频流,使用-select_streams v。其中v代表video,a代表audio,s代表subtitle。<br>
ffprobe -i input.mp4 -show_frames -select_streams v<br>
火山PCffmpeg模块+例子.zip (148.34 MB, 下载次数: 3197, 售价: 10 金钱)

评分

参与人数 1金钱 +1 收起 理由
朕的 + 1 下载不了

查看全部评分

西天守护神
回复

使用道具 举报

0

主题

2

帖子

22

积分

新手上路

Rank: 1

积分
22
25#
发表于 2024-4-15 02:04:06 | 只看该作者
新人  没金钱
回复

使用道具 举报

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
24#
发表于 2023-9-17 00:10:57 | 只看该作者
购买了下载链接有问题怎么解决
回复

使用道具 举报

1

主题

4

帖子

23

积分

新手上路

Rank: 1

积分
23
23#
发表于 2023-9-13 22:10:39 | 只看该作者
这玩意说实话,你这样封装调用EXE跑命令行,我不知道封装的意义何在。
回复

使用道具 举报

14

主题

304

帖子

1518

积分

金牌会员

接单Q:413795326

Rank: 6Rank: 6

积分
1518
QQ
22#
发表于 2023-9-11 08:54:30 | 只看该作者
购买了 下载提示 网络错误 :噜阿噜:噜阿噜:噜阿噜:噜阿噜
(\__/)
( •ᴗ•)
/> 软件 小程序 APP POST 脚本 建站 QQ:413795326
回复

使用道具 举报

1

主题

4

帖子

23

积分

新手上路

Rank: 1

积分
23
21#
发表于 2023-9-11 08:20:12 | 只看该作者
我是新来的实习生,需要金币来下载这个资源,所以来学习学习。
回复

使用道具 举报

0

主题

9

帖子

60

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
60
20#
发表于 2023-8-28 08:49:56 | 只看该作者
君安光电科技 发表于 2022-6-30 11:26
命令行的要"封装"吗?一句"运行( )"不就包罗万象了?

运行命令是不能满足的

下面这个可以满足命令的需求
  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 类 FFMPEG_类 <公开>
  3. {
  4.     变量 返回全部文本 <公开 类型 = 文本型>
  5.     变量 集_CMD <公开 类型 = CMD命令执行类 注释 = "ffmpeg\\\\bin\\\">

  6.     方法 执行_FFMPEG <公开>
  7.     参数 参_命令 <类型 = 文本型>
  8.     {
  9.         集_CMD.执行CMD2 (参_命令, 假)
  10.     }

  11.     方法 CMD命令执行类_回显数据事件 <接收事件 类型 = 整数>
  12.     参数 来源对象 <类型 = CMD命令执行类 注释 = "提供事件产生的具体来源对象">
  13.     参数 标记值 <类型 = 整数 注释 = "用户调用"挂接事件"命令时所提供的"标记值"参数值,非此方式挂接事件则本参数值固定为0.">
  14.     参数 收到的字节集 <类型 = 字节集类>
  15.     {
  16.         变量 局_回显数据 <类型 = 文本型>
  17.         变量 局_任务状态 <类型 = 文本型>

  18.         如果 (来源对象 == 集_CMD)
  19.         {
  20.             局_回显数据 = 多字节到文本 (收到的字节集)
  21.             如果 (寻找文本 (局_回显数据, "global headers:0kB", , ) != -1)
  22.             {
  23.                 局_任务状态 = "任务完成"
  24.             }
  25.             否则 (寻找文本 (局_回显数据, "Input/output error") != -1)
  26.             {
  27.                 局_任务状态 = "输入错误"
  28.             }
  29.             否则 (寻找文本 (局_回显数据, "global headers:0kB") != -1)
  30.             {
  31.                 局_任务状态 = " 任务完成"
  32.             }
  33.             否则 (寻找文本 (局_回显数据, "No such file or directory") != -1)
  34.             {
  35.                 局_任务状态 = "文件不存在"
  36.             }
  37.             否则 (寻找文本 (局_回显数据, "At least one output file must be specified") != -1)
  38.             {
  39.                 局_任务状态 = "任务完成"
  40.             }
  41.             否则
  42.             {
  43.                 局_任务状态 = "正常运行"
  44.             }
  45.             返回全部文本 = 返回全部文本 + 局_回显数据 + "\r\n"
  46.         }
  47.         返回 (0)

  48.     }
  49. }
复制代码
回复

使用道具 举报

5

主题

134

帖子

1433

积分

金牌会员

Rank: 6Rank: 6

积分
1433
19#
发表于 2023-8-26 20:58:59 | 只看该作者
无法下载,网络问题,使用的edg浏览器
回复

使用道具 举报

8

主题

40

帖子

585

积分

高级会员

Rank: 4

积分
585
18#
发表于 2023-8-11 09:27:07 | 只看该作者
无法下载啊~~~
回复

使用道具 举报

143

主题

897

帖子

3623

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3623
QQ
17#
发表于 2023-8-11 08:40:44 | 只看该作者
君安光电科技 发表于 2022-6-30 11:26
命令行的要"封装"吗?一句"运行( )"不就包罗万象了?

来你说说 运行里的参数 怎么使用,要不要封装成cmd语句?你会几个
白天不懂夜的黑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-5-18 05:31 , Processed in 0.112980 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表