ai
【多媒体】
stable-diffusion-webui-getting-started
音频视频处理 by ffmepg
stable-diffusion-webui
sd-webui-and-SadTalker
sd-webui-and-easyphoto
sd-webui-cleaner
sd-webui-text2video
sd-webui-animatediff
sd-webui-segment-anything
tts
tts-stt-by-buzz
edge-tts
tts链接
ai常用链接
ai code generater
comfyUI
安装与使用
本文档使用 MrDoc 发布
-
+
首页
音频视频处理 by ffmepg
关键字:`ffmpeg` `音视频` `音频视频` ## 截取 提取视频中的音频(-vn表示no video,-c:a 是codec of audio的意思,copy是直接拷贝视频中的原始的音频,这里不会涉及音频的编解码,速度会很快。) `ffmpeg -i input.mp4 -vn -c:a copy output.aac` 导出mp3格式的音频(-c:a mp3) `ffmpeg -i input.mp4 -vn -c:a mp3 output.mp3` 删除视频中的音频:(-an表示no audio) `ffmpeg -i input.mp4 -an -c:v copy output.mp4` 从第00:01秒开始截取到最后 `ffmpeg -ss 00:01 -i input.mp4 -c:v copy -c:a copy output.mp4` 从第00:01秒开始截取31秒 `ffmpeg -ss 00:01 -i input.mp4 -t 31 -c:v copy -c:a copy output.mp4` 从第00:00秒开始截取到14:33 `ffmpeg -ss 00:00 -i output.mp4 -to 14:33 -c:v copy -c:a copy output2.mp4` 从第00:01秒开始截取到最后 `ffmpeg -ss 00:00:01 -i input.mp3 -c:a copy output.mp3` 批处理 `for /r %i in (*.mov) do ffmpeg -i %i -an -c:v copy %i.mp4` ## 合并 ### 合并ts `ffmpeg -i "concat:0001.ts|0002.ts|0003.ts" -c copy output.mp4` ### 合并mp4 现有a1.mp4,a2.mp4,a3.mp4,想合并成一个a_all.mp4。 创建source_list.txt,内容是 ```text file 'a1.mp4' file 'a2.mp4' file 'a3.mp4' ``` 然后使用`ffmpeg -f concat -i source_list.txt -c copy a_all.mp4` ### 合并字幕和mp4 merge ass and mp4: `ffmpeg -i input.mp4 -vf ass=abcd.ass -f mp4 output.mp4` `ffmpeg -i input.mp4 -vf ass=abcd.ass -f mp4 -vcodec libx264 -crf 2 -y output.mp4` ### 合并音频与视频: #### 不指定时间(即在第1秒) `ffmpeg.exe -i p1.mp4 -i sound.ogg -vcodec copy -acodec copy p1_with_sound.mp4` #### 指定时间 ```text ffmpeg -i p1.mp4 -i sound.ogg -filter_complex "[1]adelay=5000|5000[a]" -map 0:v:0 -map "[a]" -c:v copy -c:a aac -strict experimental -y output_video.mp4 ``` 上面的命令是,不改变p1.mp4时把sound.ogg插入到第5秒(5000毫秒)处播放。 #### 把一个新音频合并到视频(已有音频)中 ```text ffmpeg -i video.mp4 -i new_audio.mp3 -filter_complex "[1:a]adelay=5000|5000[newaud];[0:a][newaud]amix=inputs=2[newmix]" -map 0:v -map "[newmix]" -ac 1 -c:v copy -c:a aac -y output_video.mp4 ``` 个人理解:`[1:a]adelay=5000|5000[newaud]`是将第2个音频延迟5秒播放并命名为newaud,`[0:a][newaud]amix=inputs=2[newmix]`是第一个视频的音频和newaud合并成一个,并命名为newmix,`-map "[newmix]"`是使用newmix作为输出。 ## 添加水印 ### 图片水印 Adding Watermark at the Bottom-Right Corner `ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" -c:v copy -c:a copy -y p1-with-watermark-image.mp4` > this command will decrease video frame rates. Explanation: ```text W and H represent the width and height of the video, respectively. w and h represent the width and height of the watermark image, respectively. W-w-10 positions the watermark 10 pixels from the right edge. H-h-10 positions the watermark 10 pixels from the bottom edge. ``` ```text You can find the original frame rate of the video by running: Look for the `fps` value in the output, find fps ffmpeg -i p1.mp4 -c:v libx264 -r 30 ``` ```shell # command: ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=x=W-w-10:y=H-h-10" -c:a copy -c:v libx264 -crf 2 -b:v originalBitrate -r originalFPS -y p1-with-watermark-image.mp4 # example: ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=x=W-w-10:y=H-h-10" -c:a copy -c:v libx264 -crf 2 -b:v 793k -r 30 -y p1-with-watermark-image-crf.mp4 ``` video quality is higher when crf is small. 指定时间显示水印: 下面的命令在第2秒~第10秒显示水印 `ffmpeg -i p1.mp4 -stream_loop -1 -i click.gif -filter_complex "[0:v][1:v] overlay=x=W-w-90:y=H-h-30:enable='between(t,2,10)':shortest=1" -c:a copy -c:v libx264 -crf 2 -b:v 793k -r 30 -y p1-with-gif-with-duration3.mp4` ### 添加文字水印 ```shell # loss fps ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x=W-text_w-10:y=10:fontsize=36:fontcolor=black@0.5:boxborderw=5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy -y p1-with-watermark-text.mp4 # more higher quality ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x=W-text_w-10:y=10:fontsize=36:fontcolor=black@0.5:boxborderw=5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy -c:v libx264 -crf 2 -b:v 793k -r 30 -y p1-with-watermark-text.mp4 `box=1` will give watermark text a background. # 横向跑马灯效果 ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x='if(gte(t,1),mod(t*100, W+tw)-tw, NAN)':y=10:fontsize=36:fontcolor=black@0.5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy -c:v libx264 -crf 2 -b:v 793k -r 30 -y p1-with-watermark-text-横向跑马灯效果.mp4 `x='if(gte(t,1),mod(t*100, W+tw)-tw, NAN)': This expression moves the text horizontally across the screen starting at 1 second. mod(t*100, W+tw)-tw ensures the text moves from left to right and loops around.` ``` Copy 微软雅黑字体(msyh.ttc) to current directory. I use c:/windows/font/msyh.ttc, but it does not work. ## 转换 aac转mp3 `ffmpeg -i input.aac -acodec libmp3lame input.mp3` ## 音频处理 ### 音频拼接 `ffmpeg -i "concat:test.mp3|radio.mp3" -acodec copy output.mp3` 将多个MP3按顺序拼接生成一个mp3 ### 补白 手动生成一条10秒长的空白音频 `ffmpeg -f lavfi -t 10 -i anullsrc test.mp3 -y` ## 添加转场 `ffmpeg -i p1.mp4 -i p2.mp4 -filter_complex xfade=transition=rectcrop:duration=2s:offset=8s -y output_3.mp4` ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex xfade=transition=rectcrop:duration=1:offset=5 -y 3.mp4 duration 持续时间 (设置交叉淡出持续时间,以秒为单位。默认为1秒) offset 偏移量 (设置交叉淡入开始相对于第一个输入流的秒。默认偏移量为0) transition 过渡效果 custom | fade | wipeleft | wiperight | wipeup | wipedown | slideleft | slideright | slideup | slidedown | circlecrop | rectcrop | distance | fadeblack | fadewhite | radial | smoothleft | smoothright | smoothup | smoothdown | circleopen | circleclose | vertopen | vertclose | horzopen | horzclose | dissolve | pixelize | diagtl | diagtr | diagbl | diagbr | hlslice | hrslice | vuslice | vdslice | hblur | fadegrays | wipetl | wipetr | wipebl | wipebr | squeezeh | squeezev | zoomin ## 图片转视频 单张图片转视频 `ffmpeg -r 25 -f image2 -loop 1 -i input2.jpg -vcodec libx264 -pix_fmt yuv420p -s 732x1200 -r 25 -t 10 -crf 2 -y output_3_png.mp4` > 这里需要注意-r 25 参数的位置,在-i input2.jpg前面和在后面的效果是不一样的。放在-i后面只会改变输出的视频帧率,而输入的还是默认值25。所以需要两次 多张图片转视频 `ffmpeg -framerate 0.33 -f image2 -loop 1 -i images/a_%2d.jpeg -vcodec libx264 -pix_fmt yuv420p -s 1080*1920 -r 25 -t 30 -y output_images2mp4_1.mp4` ```text -r 25 帧率,表示每秒播放帧数,默认帧率为25,也就是1秒钟拼接25张图片,我们可以通过调整帧率的大小来控制最终生成视频的时长。 -framerate 0.33 每秒播放图片张数,算法:round(1 / (视频总时长 / 图片总张数), 2) -f image2 输入流文件格式 -loop 1 输入流循环次数,仅对图片有效,0表示无限循环 -i fps_%d.jpg 文件名,%d、%2d表示匹配数字序列 -vcodec libx264 视频编码,缺少时h5中可能无法播放 -pix_fmt yuv420p 视频格式,缺少时h5中可能无法播放 -s 1080*1920 视频分辨率,生成的视频最终尺寸 -t 30 视频总时长,以秒为单位 -y fps.mp4 覆盖视频文件 ``` ## 视频画中画 https://www.nxrte.com/jishu/8456.html ```shell # 1. 创建主画面视频素材 ffmpeg -f lavfi -i testsrc2=s=800x480 -vcodec libx264 -t 10 input1.mp4 # 2. 创建子画面素材 ffmpeg -f lavfi -i testsrc2=s=320x240 -vcodec libx264 -t 5 input2.mp4 # 3. 开始画中画操作 ffmpeg -i input1.mp4 -filter_complex "movie=input2.mp4[in2];[in2]setpts=PTS+2/TB[out2];[0:v][out2]overlay=x=20:y=120:enable='between(t,2,4)':shortest=1" picture_in_pic.mp4 # 我们解析一下命令行参数: # 输入的主文件是 input1.mp4 # 输入的子文件是 input2.mp4 # 将子画面的所有的时间戳都加上 2 秒钟的偏移 # 将子画面显示在主画面的 x 坐标为 20,y 坐标为 120 的位置 # 子画面在主画面显示时间段是第 2 秒到第 4 秒之间 # 以主画面和子画面中时长最短的那个视频流长度为结束点(input1.mp4是10秒,input2.mp4是5秒,picture_in_pic.mp4是setpts的2s+shortest的5秒=7秒)shortest=0即是以最长的视频长度为结束点 ``` ```shell # 生成的视频有声音,是第二个视频的 ffmpeg -i input1.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=x=W-w-10:y=H-h-30,format=yuv420p[out]" -map "[out]" -map 1:a -c:v libx264 -crf 2 -r 25 -y picture_in_pic_1.mp4 ```
我是张三
2025年2月22日 20:09
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
eblog
Markdown文件
分享
链接
类型
密码
更新密码