音视频和字幕处理

Author : zbzhen,        Modified : Sun Apr 28 13:35:25 2024

常见需求

  • 录制视频
  • 单个视频提取某个时间段
  • 多个视频的合并
  • 视频降噪并添加字幕
  • 视频压缩

最终目标: 体积小,视频和音频清晰,并且有字幕的mp4文件,
整个过程都可选用免费开源软件!

必备神器ffmpeg:

当然也可以用一些开源可视化的工具, 如果不做特效的话, 个人感觉用命令行会更方便, 也会更通用

本文主要参考gpt并且用平板自带录制功能录制视频,最后处理成功

1. 录制视频

推荐两款软件

视频录制错了, 就暂停, 然后从某个节点开始重新录制

然后对视频做后处理, 也就是要处理:

提取视频的某一时间段, 以及多个视频的合并

噪音方面

录制视频有个比较麻烦的问题就是噪声太大,如果有N卡的话,推荐使用N卡降噪声. 参考(页面有下载地址):

https://www.nvidia.com/en-us/geforce/guides/nvidia-rtx-voice-setup-guide/#Requirements

如果没有N卡,也可用腾讯会议录制,手机电脑分别加入会议, 需要注意的是一定要断开某个设备里腾讯会议的音频。

或者采用后面提到的视频后处理的方案

2. 单个视频提取某个时间段

下面命令表示提取视频input.mp4的00:00:00 -- 00:27:30输出为output.mp4

ffmpeg -ss 00:00:00 -t 00:27:30 -i input.mp4 -vcodec copy -acodec copy output.mp4

3. 合并多个视频

比较快且使用的方法是先转化为ts格式,然后拼接

ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4

不过在实践中, 这样的到的视频会被莫名奇妙的被旋转了90度,后续需要做个视频旋转处理

ffmpeg -i output.mp4 -metadata:s:v rotate="90" -codec copy output2.mp4

4. 视频降噪

推荐使用软件UVR:

https://github.com/Anjok07/ultimatevocalremovergui/releases

不过它依赖显卡(否则比较慢), 但是效果非常好, 可以直接提出视频中的MP3音频文件, 并且得到清晰音频; 甚至它可以用来分离歌曲中的人声和伴奏甚至合唱

不过接下来还需要一个操作:

把xx.mp4中的音频(有噪声)替换成1.MP3的音频(无噪声)

ffmpeg -i xx.mp4 -i 1.MP3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4

只需要一行简单的命令即可

5. 视频自动添加字幕

推荐在线软件:

  • 剪映(依赖网络,且需要把你的音频上传到它的服务器), 不过可用它做一些加单的特效

推荐离线软件:

通过上面的软件可以通过视频文件得到.srt字幕文件

接下来就是合并字幕文件1.srt和视频文件xxx.wmv

ffmpeg -i xxx.wmv -vf subtitles=1.srt xxx.mp4

6. 视频压缩

有时候视频体积大是因为视频帧数比较高, 因此可以通过降低视频帧数来减少视频体积:

ffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 -preset medium output.mp4

解释一下这个命令:

  • -i input.mp4:指定输入视频文件的路径和文件名。
  • -r 24:设置输出视频的帧率为24帧/秒。你可以根据需要调整这个值。
  • -c:v libx264:指定使用libx264编码器进行视频压缩。
  • -crf 23:设置视频的质量。较低的值会产生更高质量的视频,但文件大小也会更大。较高的值会产生较低质量的视频,但文件大小会更小。一般推荐使用18-28之间的值,你可以根据需要调整这个值。
  • -preset medium:设置编码速度和压缩效率的预设值。可以选择的预设值有:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow。你可以根据需要选择适合的预设值。
  • output.mp4:指定输出视频文件的路径和文件名。

运行命令后,FFmpeg将会压缩输入视频并减少帧率,生成一个新的输出视频文件。你可以根据需要修改命令中的参数来调整压缩和帧率设置。

6.1. 减小视频体积

下面是gpt4回答, 实测可用

FFmpeg是一个非常强大的工具,可以用来处理视频和音频文件。如果你想要减小MP4文件的体积,大致有以下几种方法:

  1. 降低比特率:这是减小视频文件大小最直接的方法。比特率越低,视频文件越小,但视频质量也会相应降低。

    ffmpeg -i input.mp4 -b:v 1000k -bufsize 1000k output.mp4
    

    这里的-b:v是指定视频比特率,1000k表示1000kbps。-bufsize也设置为1000k,这有助于控制输出文件的大小。

  2. 改变分辨率:减小视频的分辨率也会减小文件的大小。

    ffmpeg -i input.mp4 -s 1280x720 output.mp4
    

    -s后面跟的是新的分辨率大小。

  3. 转换编码器:某些编码器比其他编码器更有效率。例如,H.265/HEVC通常能比H.264/AVC提供更小的文件大小,在相同的质量下。

    ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
    

    -c:v libx265指定使用x265编码器,-crf是常量速率因子,数字越大,压缩越高,质量越低。

  4. 移除音轨:如果视频文件中的音频不是必须的,移除音轨可以进一步减小文件大小。

    ffmpeg -i input.mp4 -c:v copy -an output.mp4
    

    -an参数指示ffmpeg忽略音频流。

  5. 使用2-pass编码:2-pass编码可以在给定的比特率下提供更好的质量。这会让编码过程运行两次,第一次分析视频,第二次进行实际的编码。

    ffmpeg -y -i input.mp4 -c:v libx264 -b:v 1000k -pass 1 -an -f mp4 /dev/null && \
    ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -pass 2 -c:a aac -b:a 128k output.mp4
    

    第一行命令是第一遍编码,它会生成一个日志文件,不会输出视频。第二行命令是第二遍编码,它会使用第一遍编码生成的日志文件来优化视频编码。

使用上述方法时,需要注意的是,视频质量和文件大小之间总是存在权衡。你可能需要进行一些实验,以找到适合你需要的设置。另外,FFmpeg的各个版本可能支持不同的编码器和选项,所以请确保你使用的FFmpeg版本支持你想要使用的功能。

7. 其它

7.1. 视频提取音频

`ffmpeg -i output2.mp4 -vn -ar 44100 -ac 2 -ab 128k -f mp3 "output.mp3"