Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ffmpeg指令与剪辑视频相关的姿势

从零开始的程序员剪辑视频(误)

更佳markdown渲染样式,推荐使用PC web端阅读,查看原文,地址:https://git.io/fhSBj 代码地址:https://github.com/qq519043202/lrc2srt

一个懒惰却在某些方面爱折腾的程序员开始剪辑视频,不想安装任何大型编辑软件(我的破surface也带不动的感觉)

本文不适合:想要正经学习视频编辑的萌新,右转去学一些大型的编辑软件的使用吧~

本文适合:有计算机背景或爱折腾的视频剪辑萌新,要尝试鄙人的lrc转srt脚本或歌词获取脚本的旁友,不愿意装大型软件的视频萌新(?)

本文有大致如下内容:

  1. 在剪辑视频用到的各种ffmpeg命令的示例,如剪切、格式转换、码率调整、编码器转换、压制、按帧截图、与使用过程中碰到的一些坑与解决方法(详细使用方法查看官方文档)
  2. 从网易云音乐歌词接口(with 翻译)爬取lrc歌词文件
  3. 将lrc文件(with 翻译)转成srt字幕文件

本人原本的音视频姿势约等于0,文章描述可能会有不准确的地方,文章很多方法也许有更好的解决方法,欢迎告知讨论~

本文以“从演唱会视频剪切出部分歌曲片段,然后做字幕”为例子,来介绍

[TOC]

片源

  1. 从b站下载

    安卓移动端可以直接缓存,下载下来显示是.blk格式(好像直接替换成mp4或者ffmpeg转一下),下载下来的可能是视频片段,需要拼接(ffmpeg,拼接的指令在宿舍电脑上好像,现在没怎么用到,懒得查了,之后再补充)

    WEB端上,下载视频,可以通过一些插件与脚本实现,自行必应

  2. 从nyaa下载——我感觉还行的(盗版)资源网站

这一块我也是萌新,有好的片源网站欢迎推荐

获取歌词

参考某乎该回答,该回答也提供了一个软件可以获取翻译与原文,直接使用即可(封装死的安全性未知,我用过挺好用的,就是提醒大家少装来路不明的软件,不是有作者任何的意见9 9)

或者使用我的python实现,查看getlrc.py

更多API信息参考该网站(原博主的网站挂了,这是某转存的链接)

剪切视频

截取视频中的一小段,接下来介绍两种方法,一个极速的方法与一个慢速的方法适用不同的场景

坑:MP4中可能会含有目录信息,在转码时如果没有处理的话,转码出来的视频在时长显示上会有问题添加该参数-map_metadata -1即可

  1. 直接从视频文件中截取,这种方法非常的快,但是由于视频编码与关键帧等原因,截取的视频时间片段不符合预期

    推荐先执行此命令,看看得到的视频是否符合要求不符合再采用下一个方法

    ffmpeg -ss [start] -to [end] -accurate_seek -i [in].mp4 -codec copy -avoid_negative_ts 1 -map_metadata -1 [out].mp4

    参数说明:

    ss : 开始时间 如00:42:50

    to : 结束时间 同上

    [in].mp4, [out].mp4 : 输入视频文件名支持任意格式吧

    -codec copy: 输出视频采用与输入视频相同的视频音频编码,不同视频格式可能有一些编码方式是不通用的在视频格式转化的过程中可能出问题,需要设定指定编码

    # 完整例子
    ffmpeg -ss 00:42:50 -to 00:46:02 -accurate_seek -i input.mp4 -codec copy -avoid_negative_ts 1 -map_metadata -1 output.mp4
  2. 对视频重编码进行精确剪切,速度较慢

    ffmpeg -ss [start] -to [end] -i "ML4th DAY3.mkv"  -c:v libx264 -c:a aac -strict experimental -map_metadata -1 -y output.mp4

    参数说明:

    -c:v 是 -vcodec的缩写,指定输出视频编码格式

    -c:a 是 -acodec的缩写,指定输出音频编码格式(-codec 就是二者的合体

    可以在这一步中同时进行视频格式的转码,B站比较支持mp4或flv,就顺带转了

坑:遇到了一个MP4转出来没有声音的情况,换了一个播放器就好了,win自带的播放器都是残疾人...

注意:其实这一部分,我花的时间踩的坑最多了,不是很推荐,大家有用的顺手的剪切软件直接用就行(PS:格式工厂也切不准的)

格式转化&码率调整

这两步都可以在上面剪切重编码中同时进行

  1. 格式转码,其实就是音视频编码格式的转换?

    例子1:mkv转mp4,采用同样的编码进行尝试(很快),如果报错了则采用例子2

    ffmpeg -i output.mkv -codec copy output.mp4

    例子2:mkv转mp4,指定编码进行转化(我猜只要是编码格式适用了,就可以进行任意格式之间的转换)

    ffmpeg -i output.mkv -c:v libx264 -c:a aac output.mp4
  2. 码率调整(可以在转码的过程中一起完成)

    ffmpeg -i input.avi -b 4M output.mp4
    

    参数说明:

    -b 指定音视频整体码率 (或者下面两个

    -b:v 指定视频码率

    -b:a 指定音频码率

    输入参数可以是 4M 320K这样的

制作字幕

Aegisub软件 简易教程av41766494,感谢这位up,我这么偷懒的人就是需要这种简短精悍的教程

看了他的教程,我才想可以做一个从lrc中自动生成字幕的脚本(也许有现成更好的方案,嘛一噶(日语)

建议用文本编辑器,打开lrc文件与srt文件,就能看懂到底是怎么样的格式,其实特别简单的啦

上面获取的歌词lrc文件是带有翻译的,类似这样,歌词与翻译是分开的,时间轴是一致的

[03:29.82]ブランニューワンダーランド!
[03:31.97]ところでクエスチョン
[03:33.13]Tell Me! What's My Name?
[03:35.09]Call My Name! …Please!
[by:都和你很像]
[00:01.71]有一天醒来,突然失忆啦!
[00:06.67]啊,这是哪里?我是谁呢?I don't know!
[00:10.36]这不就是那啥??那啥是啥来着??
[00:15.09]啊,难道是传说中的丧失记忆?!

我们的目的是生成这样的srt文件,将翻译与原文的时间轴对上,然后用\N隔开,在字幕显示上就是分成两行了

1
00:0:01,70 --> 00:0:06,60
ある日目覚めたら、忘れちゃってました!\N有一天醒来,突然失忆啦!

2
00:0:06,60 --> 00:0:10,30
ああ、ココはドコ?ワタシはダレ? I don't know!\N啊,这是哪里?我是谁呢?I don't know!

脚本查看main.py

不负责任介绍:srt是这样的比较简单的字幕格式,用Aegisub打开后,然后进行一顿样式调整,时间轴调整然后另存为ass格式就带有复杂的样式了

视频压制

压制大概就是把字幕嵌入到视频中的意思,需要较长的时间

mkv格式好像有点特殊,这里给出mp4的例子,其他格式没有试过

示例:

ffmpeg -i output.mp4 -vf "ass=ass_test.ass" result.mp4
ffmpeg -i output.mp4 -vf subtitles=srt_test.srt result.mp4

最后得到的result.mp4就是完整的带字幕视频了

有时候要结合上面的操作一起弄,给出具体例子

ffmpeg -i out.mp4 -vf "ass=result.ass"  -b:v 4M -b:a 320K -map_metadata -1 result.mp4

视频按帧截图

最后想要找一个合适的视频封面,手动截图难以精确到帧,这个时候就需要这个指令了

# 从1:26起截3秒钟
ffmpeg -ss 1:26 -i file.mp4 -y -f image2 -t 3 b-%03d.png

参数说明:

-ss 开始时间

-t 持续时间

b-%03d.png 保存文件命名与格式

制作gif

ffmpeg -r 29 -i "b-(%02d).png" -s 960x540 -y 11.gif

音频配图制作视频

mtg04 广播剧 一图流时用的

-r 30 30帧

ffmpeg -r 30 -f image2 -loop 1 -i 0017.png -i drama.wav -s 1280x720 -t 1472 -vcodec libx264 -acodec copy -b:a 1.4M -y drama.mp4

调用gpu

需要安装CUDA -hwaccel_device 0表示调用第0块显卡

示例如下:

ffmpeg -hwaccel cuvid -hwaccel_device 0 -i bs.mp4 -c:v h264_nvenc -vf "ass=bs.ass" -map_metadata -1 -b:v 4M -b:a 320k outmovie4.mp4 ffmpeg -hwaccel cuvid -hwaccel_device 1 -i bs.mp4 -c:v h264_nvenc -vf "ass=bs.ass" -map_metadata -1 -b:v 8M -b:a 320k outmovie8.mp4

使用其他音轨

-map 0:0 -map 0:3 这个?

ffmpeg -ss 2:38:41 -to 02:43:55 -accurate_seek -i in.mp4 -codec copy -avoid_negative_ts 1 -map 0:0 -map 0:3 -map_metadata -1 -y re_test.mp4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.