FFMPEG 视频分割和合并
一、分段
ffmpeg-ss 00:00:00-t 00:00:30-I test.mp4-vcodec副本-acodec副本output.mp4
-ss指定何时开始-t指定截取多长时间-i指定输入文件。该命令用于从00秒到00 30=30秒剪辑视频,总共30秒。这个命令执行得很快,因为它只是原始数据的副本,中间没有编码和解码的过程。执行该命令后,可以得到output.mp4的输出文件。可以用视频播放软件播放这个视频。有些视频剪辑后可能会有同样的效果,比如预期中的,从00秒开始,到30秒结束,一共30秒。但是剪辑一些视频后,你会发现开始和结束都不是很准确,可能是00秒开始,33秒结束。这是为什么呢?因为这些视频中的30秒钟并不是关键帧,ffmpeg会在你输入的时间附近找到最近的关键帧,然后做下一件事。如果你不知道什么是关键帧,没关系,也不影响你使用这个命令。
如果你的项目中要求非常严格,一定要在确定的时间到达。那你就要用另一种方式了。
以上原因是选定的时间不是关键帧。如果我们先把输入的视频转换成一个所有帧都是关键帧的视频,其实就是把所有帧的编码方式都改成帧内编码(你不懂帧内编码也没关系,直接忽略然后往下看),这个问题就解决了。Ffmpeg也可以帮助我们实现这一点。
ffmpeg -i输入-sameq-帧内输出
-i输入,后跟一个空格,后跟输入的视频文件;
输入文件;
-sameq表示保持相同的视频质量;
-帧内、帧内编码;
输出文件名。
比如:
ffmpeg-I ./my video . mpg-sameq-intra。/temp.mpg
该命令的结果文件是。/temp.mpg .这个文件的视频和。/MyVideo.mpg,但是你会发现这个文件会比。/myvideo.mpg .原因是转换前常用的帧间编码变成了转换后的帧内编码。我们这里说一般,是因为有些视频文件本身就采用了帧内编码。经过这样的处理,我们就可以准确地剪切视频了。
注意,的上述命令在新版本中已被放弃。请参考以下命令。
ffmpeg-1 output.mp4-严格-2-q scale 0-keyoutput.mp4内部
使用ffmpeg进行flv分段
ffmpeg-y-I d :/XXX . MP4-vcodec copy-an-f segment-segment _ time 120-BSF :v h264 _ MP4 toannexb-segment _ list d :/segment/out . CSV d :/segment/% d . flv
使用FFmpeg命令对hls进行切片。
ffmpeg-I video2.mp4-force _ key _ frames ‘ express : GTE(t,n _ forced * 1)’-strict-2-c : a AAC-c :v libx 264-HLS _ time 1-f HLS out . m3u 8
其中,参数-force _ key _ frames ‘ expr : GTE(t,n _ forced * 1)’表示每1秒强制一个关键帧。
参数-strict -2是使用aac音频编码。
执行上述命令后,我们可以在生成的m3u8文件中看到,生成的ts文件的时长变成了1秒,如下图所示:
ffmpeg-y-ss start-t duration-accurate _ seek-I文件名编解码器copy -avoid_negative_ts 1
二。合并
//从开始截取30s
ffmpeg-ss 00:00:00-t 00:00:30-I keyoutput.mp4-vcodec副本-acodec副本split.mp4
//从30s截取30s
ffmpeg-ss 00:00:30-t 00:00:30-I keyoutput.mp4-vcodec副本-acodec副本split1.mp4
//合并视频。
复制concat.mp4
方法1: FFmpeg concat协议
对于MPEG视频,您可以直接连接到:
ffmpeg-I ‘ concat : input 1 . mpg | input 2 . mpg | input 3 . mpg ‘-c copy output . mpg
对于非MPEG格式的容器,但是MPEG编码器(H.264,DivX,XviD ID,MPEG4,MPEG2,AAC,MP2,MP3等。),可以把它们打包成TS格式的容器,然后合并。在新浪视频中,很多视频使用H.264编码器,可以采用这种方式。
ffmpeg -i输入1 . flv-c copy-BSF :v h264 _ MP4 toannexb-f mpeg ts输入1.ts
ffmpeg -i输入2 . flv-c copy-BSF :v h264 _ MP4 toannexb-f mpeg ts输入2.ts
ffmpeg -i输入3 . flv-c copy-BSF :v h264 _ MP4 toannexb-f mpeg ts输入3.ts
ffmpeg-I ‘ concat : input 1 . ts | input 2 . ts | input 3 . ts ‘-c copy-BSF : a AAC _ adtstoasc-mov flags快速启动output.mp4
保存QuickTime/MP4格式容器时,建议添加-movflags faststart。这样,您可以在阅读文件的同时与他人共享。
方法2: FFmpeg连接分隔符
这种方法成功率高,是最好的,但是需要1.1以上的FFMPEG版本。首先创建一个文本文件filelist.txt:
文件’ input1.mkv ‘
文件’ input2.mkv ‘
文件’ input3.mkv ‘
然后:
ffmpeg -f concat -i文件列表. txt -c复制输出. mkv
注意:
1.使用FFmpeg concat分隔符时,如果文件名中有奇怪的字符,应该在filelist.txt中进行转义
2.在测试过程中发现,文件的后缀(如果视频格式异常,可能会导致失败,非视频格式可以选择mp4)可能会影响文件格式。所以你需要注意使用正确的后缀。
3.filelist.txt中的文件’ input1.mkv ‘在windows下必须有分号才能合并成功,但在Linux下可以省略分号。最好带分号。
4.如果背景合并,ffmpeg后台操作无法判断合并何时完成。通过生成日志文件,您可以找到相关的日志信息。
4.1在后台运行nohup ffmpeg-f concat-I filelist . txt-c copy output . mkv 1 XXX . log 21
4.2从xxx.log日志文件中查找相关信息(搜索文件名和副标题)。
5.同步运行,不打印日志。使用以下参数,如-loglevel quiet或-v quiet。
6.ffmpeg视频剪切时间不正确。
在windows下使用以下命令ffmpeg剪切视频时,发现剪切时间会比设定时间长。
0.mp4-c副本2.mp4
上面的命令是把视频从10s切到30s,但实际时长大概是32s。
原因:-c copy就是没有重新编码,直接裁剪视频,这样会出现一个问题:如果不重编码的分割视频,就需要对准视频的关键帧分割,比如视频的关键帧在8s处,而你是从10s开始分割,分割就会调整在8s处,这样剪切出来的视频就会比想要的长了
解决方法:目前我的解决方法就是重新编码视频,去掉-c copy就行了,不过重新编码有点耗时间。
三。常见命令如下
//从视频中删除音频
input.mp4-vcodec副本-output.mp4
//-an3360去掉音频;-vcodec:视频选项,通常后跟copy以表示复制。
//从视频中提取音频
ffmpeg-I input.mp4-acodec复制-vn输出. mp3
//-vn:删除视频;-acodec:音频选项,通常后跟copy表示复制。
//音频和视频合成
ffmpeg-yI input.mp4I input . MP3vcodec copyacodec copy output.mp4
//-y覆盖输出文件
//切视频
ffmpeg-ss 0:1:30-t 0:0:20-I input.mp4-vcodec副本-acodec副本output.mp4
//-ss开始时间;-t持续时间
//视频截图
ffmpegI test.mp4f image2-t 0.001-s 320 x240 image-=。使用jpeg文件交换格式存储的编码图像文件扩展名
//-s设置分辨率;-f .强制采用fmt格式;
//视频被分解成图片
ffmpegI test.mp4R1f image2 image-=。使用jpeg文件交换格式存储的编码图像文件扩展名
//-r指定屏幕捕获频率
//将图片组合成视频
ffmpeg -f图像2 -i图像% d . jpg output.mp4
//视频拼接
output.mp4拷贝
//把视频变成gif
ffmpeg-I input.mp4-ss 0:0:30-t 10-s 320 x240-pix _ fmt RGB 24 output . gif
//-pix_fmt指定编码
//将视频的前30帧转换成gif
ffmpeg-I input.mp4-v frames 30-f gif输出. gif
//旋转视频
ffmpeg-I input.mp4-VF旋转=/2 output.mp4
//缩放视频
ffmpeg-I input.mp4-VF scale=iw/2:-1 output.mp4
//iw是输入的宽度,iw/2是一半;-1以保持纵横比
//视频变速
ffmpeg-I input.mp4滤波器:v设定值=0.5 * PTS output.mp4
//音频变速
ffmpeg -i输入. mp3 -filter:a atempo=2.0输出. mp3
//音频和视频速度同时变化,但是音频和视频是互逆的。
ffmpeg-I input.mp4滤波器_复合体'[0:v]setpts=0.5 * PTS[v];[0: a]a tempo=2.0[a]’-map ‘[v]’-map ‘[a]’ output.mp4
//给视频添加水印
ffmpeg-I input.mp4-I logo.jpg-filter _ complex[0:v][1:v]overlay=main _ w-overlay _ w-10: main _ h-overlay _ h-10[out]-map[out]-map 0: a-codec : a copy output.mp4
//main_w-overlay_w-10视频宽度-水印宽度-水印边距;
//截取视频部分
ffmpeg-I in.mp4滤波器:v ‘ crop=out _ w : out _ h : x :y ‘ out.mp4
//截取部分视频,从[80,60]的位置开始,截取宽度为200,高度为100的视频。
ffmpeg-I in.mp4滤波器:v ‘ crop=80:60:200:100 ‘-c : a复制out.mp4
//剪辑右下角的四分之一
ffmpeg-I in.mp4滤波器:v ‘ crop=in _ w/2: in _ h/2: in _ w/2: in _ h/2 ‘-c : a复制out.mp4
//截断底部40个像素的高度
ffmpeg-I in.mp4滤波器:v ‘ crop=in _ w : in _ h-40 ‘-c : a复制out.mp4
视频交换
视频转JPEG
ffmpeg-itest . flv-r 1-fimage 2 image-=。联合图象专家组
将视频转换为gif
ffmpeg-iout . MP4-ss 00:00:00-t 10 out . gif
图片到视频
ffmpeg-fimage 2-ii image-=. jpegimages . MP4
直播关联
推流
ffmpeg-re-iout . MP4-c copy-f flv rtmp ://server/live/stream name
拉式保存
ffmpeg-I rtmp ://server/live/stream name-c copy dump . flv
转六
ffmpeg-I rtmp ://服务器/直播/原始流-c:a复制-c:v复制-f flv rtmp ://服务器/直播/h264流
实时推送流
ffmpeg-frame rate 15-f av foundation-I ‘ 1 ‘-s 1280 x720-c :v libx 264-f flv rtmp ://localhost :1935/live/room
ffplay
播放YUV数据
ffplay-pix _ fmt NV 12-s 192 x144 1 . YUV
在YUV中玩Y平面
ffplay-pix _ fmt nv21-s 640 x480-vfextractplanes=’ y ‘ 1 . YUV
参数描述:
-vcodec xvid使用xvid压缩。
-s 320×240指定分辨率
-r fps默认将帧速率设置为25。
-b比特率指定压缩的位数。
-acodec aac设置声音编码。
-ac值设置声道数,1为单声道,2为立体声。
-ar采样率设置声音采样率,PSP只识别24000。
-ab比特率设置声音比特率
-vol percentage设置音量。
-y(覆盖输出文件
-t duration设置录制时间。hh:mm:ss中的记录时间。xxx]]格式也支持。
-ss位置搜索指定时间[-]格式为[-]hh:mm:ss[。也支持xxx]]。
-title string设置标题。
-author string设置作者
-版权字符串设置版权。
-总部激活高质量设置。
-纵横比将纵横比设置为4:3 1633609或1.33777。
-croptop size设置顶部裁剪带大小的像素单位。
-底部裁剪尺寸-裁剪尺寸-裁剪尺寸
-padtop size设置顶部填充的大小像素单位。
-填充底部尺寸-填充左侧尺寸-填充右侧尺寸-填充颜色颜色设置填充条的颜色(十六进制,六个十六进制数字,红色:绿色3360蓝色,例如00000代表黑色)
-bt tolerance设置视频比特率容差kbit/s
-maxrate bitrate设置最大视频速率容差。
-minrate bitreate设置最小视频速率容差。
-bufsize size设置速率控制缓冲区的大小。
-vcodec编解码器执行编解码器编码和解码方法。If copy表示必须复制原始编解码器数据。
-sameq使用与源相同的视频质量(VBR)
-通道n选择加工通道的数量(1或2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成准确的请求码率。
-passlogfile file两次选择的记录文件名是file。
-mapfile3360stream设置输入流映射
-debug打印特定的调试信息。
四、ffmpeg 后台运行,输出重定向,记录log和把文件输出到终端
1.在后台运行nohup
nohup ffmpeg-report-fflags nobuffer-probesize 50-analyzed duration 100-I rtmp ://127 . 0 . 0 . 1/live/test-f HLS-c copy-HLS _ flags delete _ segments-HLS _ time 1-HLS _ list _ size 3-HLS _ segment _ filename output-d.ts表521.m3u8 1/dev/null 21
nohup的介绍参考了这篇文章,https://mp.weixin.qq.com/s/nyT-FPdIUdJUiUCYVGEnTg.
1代表标准输出。
2代表标准误差。
1/dev/null将标准输出导入到空设备,也就是说,它消失了。如果你想重定向到一个文件,你可以使用11.txt
21将标准误差导入到与标准输出相同的位置。
-report将ffmpeg命令行和终端的输出(标准和错误)记录到一个名为program-yyyymmdd-hhmmss.log的文件中,日志文件将在ffmpeg所在的目录下生成。您可以设置日志级别和长文件名,这有助于查找需要长时间运行的错误。
2.输出到终端
ffmpeg-I rtmp ://live . hkstv . hk . LX DNS . com/live/hks-an-c :v copy-BSF :v h264 _ MP4 toannexb-f h264-y-666 2777
66省略了1,原来是1666。
66文件中的Timeout 0,ret=1是我在libavformat数据库中打印的日志。
说明库打印的日志属于标准输出,而ffmpeg.c打印的日志属于标准错误。您可以用21指定标准误差,并将其打印到标准输出中。
-两个字符之间有一个空格。-表示将输出视频文件(不属于标准输出)输出到终端。如果你想通过管道将输出到终端的视频流保存到文件中,你可以使用下面的指令
ffmpeg-I rtmp ://live . hkstv . hk . LX DNS . com/live/hks-an-c copy-BSF :v h264 _ MP4 toannexb-f h264-| cat-output . h264