慢慢总结……
文章目录
moviepy
这个感觉非常好用,包括裁剪,之类的
from moviepy.editor import VideoFileClip
查时长
同样有 AudioClip
clip = VideoFileClip(fnm)
print( clip.duration )
librosa
duration = librosa.get_duration(filename=line)
介绍
https://www.cnblogs.com/LXP-Never/p/11561355.html
https://www.cnblogs.com/LXP-Never/p/10918590.html
https://librosa.org/
pydub
获得音频时长
from pydub import AudioSegment
AudioSegment.from_wav(fnm).duration_seconds
通过网页获得二进制数据进行播放
import pydub
from pydub.playback import play
data = r.content # 已某种方式获得 字节流,比如通过 request
song = pydub.AudioSegment.from_file(io.BytesIO(data), format="wav")
play(song)
音频拼接: 基于毫秒整数级别直接相加拼接音频。
bg_tm = int( bg * 1000 )
ed_tm = int( tm * 1000 )
merge_a = base_a[:bg_tm] + gen_a + base_a[ed_tm:]
merge_a.export(fa_tmp1, format="wav")
sox
这个需要 apt install 安装
soxi xx.wav
mediainfo
也是 apt install 安装的,可以查看 语音视频数据的信息
ffmpeg
安装
因为会用anaconda,所以这样装的话会有ffmpeg
conda install x264 ffmpeg -c conda-forge
资料
用法
查看信息
ffmpeg -i input.file
ffmpeg -codecs
支持的编码格式
ffmpeg -formats
查看支持的输出格式
ffmpeg -muxers
查看同上?
ffmpeg -h encoder=qtrle
查看某个编码支持的format
// Supported pixel formats: rgb24 rgb555be argb gray
提取音频
提取wav
注意一些参数的设置,如果不加的话音频会比较大
ffmpeg -ss 3 -t 83 -i a.mp4 -acodec pcm_s16le -ar 24000 -ac 1 jazz_3.wav
提取mp3
-vn 表示不要视频
ffmpeg -i a.mp4 -f mp3 -vn a.mp3
截取、裁剪、缩放、设置码率、不输出log
省了用ocv处理了
ffmpeg -y -loglevel error -i $fin -ss 3 -t 32 -vf crop=1700:1700:950:200,scale=900:900 -vcodec mpeg4 -b:v 42627k $fout
crop=w:h:x_left:y_top
缩小视频
ffmpeg -y -loglevel error -i song1.mp4 -vf "scale=iw/2:ih/2" -profile:v baseline -vcodec h264 -crf 24
文字水印
ffmpeg -y -loglevel error -i $fvin -vf "drawtext=fontfile=/Library/Fonts/Arial Unicode.ttf:text='合成视频
make by XXX':y=(mod(7*n\,h+th)):x=(mod(5*n\,w+tw)):enable=lt(mod(t\,1)\,1):fontsize=120:fontcolor=yellow:shadowy=2" -b:v 3000k $fvout
旋转90度
ffmpeg -i $INPUTVIDEO -metadata:s:v rotate="-90" -codec copy $OUTPUTVIDEO
还有一种方法是使用参数:
need_params="-vf transpose=1"
must_params="-r 25 -shortest -c:v h264 -crf 18 -preset slow -strict -2"
ffmpeg -y -loglevel error -i yangp.JPG -i maxiaohao.wav -r 1 -pix_fmt yuvj420p -b:v 3000k -vf crop=1700:2300:682:615,scale=1020:1380 res.mp4
ffmpeg -y -loglevel error -i a.mp4 -vf "transpose=2" out.mp4
# -c copy -metadata:s:v:0 rotate=90
手机拍摄后,缩放视频,旋转
exe="ffmpeg -loglevel error -y -threads 4"
$exe -i video_clip/$x.mp4 -metadata:s:v rotate="0" -vf "scale=720:1280" -c:v h264 -crf 18 -preset veryslow -strict -2 resize/$x.mp4
# -c:a copy 声音如果不重复编码,好像会对不上
码率。分辨率
ffmpeg -i input.mp4 -b:v 10000k -s 216x384 output4.mp4
合并视频
filelist.txt 可能必须和视频同目录
ls crop/talk_*.mp4 | awk -F/ '{ print "file " $2}' > crop/filelist.txt
cat crop/filelist.txt
$exe -f concat -i crop/filelist.txt -c copy crop/merge_think_watch.mp4
多种结合,-ss, -t 在前面会快很多,-r 在前面不知道是否有问题
$exe -ss 7 -t 600 -i video_org/talk_think1.mp4 -metadata:s:v rotate="0" -vf scale=720:1280,crop=512:512:100:120 \
-r 25 -shortest -c:v h264 -crf 18 -preset veryslow -strict -2 video_clip/talk_think1.mp4
音频延时
ffmpeg -i video.mp4 -i audio.wav -filter_complex "adelay=150|150" output.mp4
提取图片,合并视频
n 表示提取几张
ffmpeg -i test.asf -y -f image2 -ss xx:xx:xx -vframes n test%d.jpg
# method 2
ffmpeg -i {} -start_number 0 {}/%05d.png
合并成视频
ffmpeg -r {} -y -i {}/%05d.png -b:v 10000k -c:v libx264 -colorspace 11 -color_primaries 1 -color_trc 1 -vf format=yuv420p {}
#pts !=1
ffmpeg -r {} -y -i {}/%05d.png -b:v 10000k -c:v libx264 -colorspace 11 -color_primaries 1 -color_trc 1 -filter:v format=yuv420p,setpts={}*PTS {}
缩放图片
不想每次都自己写代码
ffmpeg -i a.png -vf scale=302:-1 use_imgs/open.png
视频水平竖直拼接
https://www.codetd.com/article/9756362
1. 水平拼接
ffmpeg -i out1.mp4 -i out2.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
//pad是将合成的视频宽高,这里iw代表第一个视频的宽,iw*2代表合成后的视频宽度加倍,ih为第一个视频的高,合成的两个视频最好分辨率一致,[a]表示前面的操作命名为[a]。overlay是覆盖,[a][1:v]overlay=w,后面代表是覆盖位置w:0,整体表示叠加。
2.竖屏拼接
ffmpeg -i out1.mp4 -i out2.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out.mp4
三个视频拼接
1.横向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out.mp4
2.竖向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out.mp4
四个视频2x2方式排列
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
后面发现有更简单的方法:
垂直拼接用 vstack, 水平拼接用 hstack,= 后面跟着数量
ffmpeg -i inp1.mp4 -i inp2.mp4 -filter_complex vstack=inputs=2 -c:v h264 -b:v 20m out.mp4
音视频分离和拼接
// 去掉视频中的音频
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
// -an: 去掉音频;-vcodec:视频选项,一般后面加copy表示拷贝
// 提取视频中的音频
ffmpeg -i input.mp4 -acodec copy -vn output.mp3
// 生成wav必须要指定,否则文件会很大
ffmpeg -i input.mp4 -ac 1 -ar 16000 -f wav -vn output.wav
c++ 使用
http://ffmpeg.org/releases/
http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
../configure --prefix="xxx/bin/ffmpeg" --enable-pic --enable-shared
重新编译
https://www.jianshu.com/p/ee7719946fac
git clone https://git.ffmpeg.org/ffmpeg.git
备份
./configure --arch=x86 --enable-shared --disable-static --enable-libmp3lame --disable-yasm
./configure --prefix=xxxxx/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-videotoolbox --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=clang --host-cflags= --host-ldflags= --disable-x86asm