目录
ffmpeg -y -copyts -ss 1:49 -i ~/Videos/input.mkv -c copy -t 1:00 timing-1m49s.mkv目录
1、多路数据制造
音频采样频率,单位:hz (1)、音频编码格式为mp3时,ar支持:44100、48000、32000 、22050 、24000、 16000 、11025、 12000 、8000 (2)、音频编码格式为aac时,ar支持:96000、88200、64000、 48000、 44100、 32000、 24000、 22050 、16000、 12000、 11025 、8000 (3)、特殊说明:视频封装格式为flv且音频编码格式为mp3时,ar不支持32000、48000
(1)合并多路
合并一个4路视频流的视频
ffmpeg -i v001.mp4 -i v000.mp4 -i a002.mp4 -i a001.mp4 -map 0 -map 1 -map 2 -map 3 -c copy 600.mp4
(2) 视频修改分辨率
修改分辨率:
ffmpeg -i video.mp4 -vf scale=1080:1920 1080_1920.mp4
ffmpeg -i input.jpg -vf scale=320:240 output_320x240.png
ffmpeg -i input.mp4 -b:v 10000k -s 216x384 output4.mp4
(3) 修改视频码率
ffmpeg -i D:/download/cutVideo.mp4 -b:v 64k -bufsize 64k -y D:/download/output64.mp4
(4)修改帧率
修改帧率:ffmpeg -i video.mp4 -r 40 -y 40frames.mp4
2、音频流多声道合成
# 查看支持的声道布局
ffmpeg -layouts
# 查看ffmpeg支持的音频编码格式
ffmpeg -codecs|findstr Audio(windows下查看的)
(1)双声道合并单声道
ffmpeg -i input.aac -ac 1 output.aac
(2)双声道提取
# ffprobe先探测 output.mp4那一路是音频流,我这里是0:1路
ffprobe -v quiet -show_streams -of json output.mp4
# map_channel方式
ffmpeg -i output.mp4 -map_channel 0.1.0 left.aac -map_channel 0.1.1 right.aac
# pan滤镜
ffmpeg -i output.mp4 -filter_complex "[0:1]pan=1c|c0=c0[left];[0:1]pan=1c|c0=c1[right]" -map "[left]" left1.aac -map [right] right.aac
(3) 双声道转双音频流
ffmpeg -i output.mp4 -filter_complex channelsplit=channel_layout=stereo -y test1111.mp4
(4)单声道转双声道
# 提取一路mono的音频流
ffmpeg -i test1111.mp4 -map 0:0 ew.aac
# 转成双声道
ffmpeg -i ew.aac -ac 2 channel_2.aac
(5)两路音频合并双声道
ffmpeg -i ew.aac -i ew.aac -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" channels_2.aac
(6)合并多声道
# 5.1声道
ffmpeg -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" out.aac
# 7.1声道
ffmpeg -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -i audio.aac -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a][5:a][7:a]amerge=inputs=8[aout]" -map "[aout]" out.aac
(7) 声道和编码格式
# 合并声道,音频转码了
ffmpeg -i ew.aac -i ew.aac -i ew.aac -i ew.aac -c:a mp3 -filter_complex "[0:a][1:a][2:a][3:a]amerge=inputs=4[aout]" -map "[aout]" channels_4.mp3
# mp3格式不支持5.1声道,最多支持到4声道-下面的命令转出的文件探测是双声道
ffmpeg -i ew.aac -i ew.aac -i ew.aac -i ew.aac -i ew.aac -i ew.aac -c:a mp3 -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" channels_5.1.mp3
# aac格式可以支持到48声道,压缩率高,画质由于mp3,但是他们都是有损的压缩,flac是无损压缩
ffmpeg -i ew.aac -i ew.aac -i ew.aac -i ew.aac -i ew.aac -i ew.aac -c:a flac -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" channels_5.1.flac
2、视频相关处理
(1)查看视频信息
# 看是否是关键帧,帧大小,时间戳
ffprobe -v quiet -of compact -show_packets -select_streams v output.mp4
FLVBugger工具查看flv文件情况
(2)造大帧文件
ffmpeg -i input.mp4 -vcodec libx264 -crf 0 -f mp4 output.mp4
# 无损但是帧并不是很大
(3)造大gop的文件
obs设置帧间距20
(4) copyts参数
产生一个1分钟的文件,时间戳从1:49开始
ffmpeg -y -copyts -ss 1:49 -i ~/Videos/input.mkv -c copy -t 1:00 timing-1m49s.mkv
-copyts:复制时间流,这个很重,查阅很多资料才找到的复制时间流命令,主要功能是将ts分片保留原先时间流,保证和m3u8索引文件里面记录的分割时间一致。如果不在加这个,播放视频的时候,会卡顿,ts分片加载不准确
(5)视频参数修改
修改分辨率:ffmpeg -i video.mp4 -vf scale=1080:1920 1080_1920.mp4
ffmpeg -i input.jpg -vf scale=320:240 output_320x240.png
ffmpeg -i input.mp4 -b:v 10000k -s 216x384 output4.mp4
修改码率:ffmpeg -i D:/download/cutVideo.mp4 -b:v 64k -bufsize 64k -y D:/download/output64.mp4
修改帧率:ffmpeg -i video.mp4 -r 40 -y 40frames.mp4
拼接视频:
(1)并行播放:ffmpeg -i zhang.flv -i du.flv -to 00:01:00 -filter_complex hstack -f mp4 101201.mp4(左右屏幕播放的情况,音频去了第一个源的)
(2)串行播放:
ffmpeg -i zhang1.flv -i du1.flv -filter_complex "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" -f mp4 101202.mp4
#拼接文件多的时候,用文件的形式filelist.txt里面是拼接的文件名或url
文件格式
file 'LIVE-HD1080.mp4'
file 'LIVE-HD1080.mp4'
file 'LIVE-HD1080.mp4'
file 'LIVE-HD1080.mp4'
file 'LIVE-HD1080.mp4'
file 'LIVE-HD1080.mp4'fmpeg -f concat -safe 0 -i filelist.txt -y output.mp4
截取视频:ffmpeg -i video.mp4 -ss 00:00:10 -to 00:30:00 -f mp4 sdfsd.mp4(截取第10秒开始到30分钟的数据)
4、ffprobe使用
(1)查看duration
ffprobe -v quiet -show_format 64k.mp4 | findstr duration(windows下,liunx下吧findstr换成grep)
# 同时查看两个文件对比着看
ffprobe -v quiet -show_format 64k.mp4 | findstr duration & ffprobe -v quiet -show_format 64k.mp4 | findstr duration
(2)查看时间戳
#liunx下,查看最后3个时间戳
ffprobe -v quiet -show_packets -select_streams v xuanzhuan.mp4 2> x|grep pts_time |tail -n 3
(3)查看时长
ffprobe -v quiet -show_format xuanzhuan.mp4|grep duration
(4)查看视频关键帧
ffprobe -v quiet -of compact -show_packets -select_streams v ../out_10.mp4 |grep K
5、切片
(1)hls
只支持ts切片
# 文件必须包含的字段
# 区别是直播m3u8还是点播m3u8
第一点:点播文件有#EXT-X-ENDLIST标志结束,直播么有
第二点:直播文件的#EXT-X-MEDIA-SEQUENCE:0会变化,点播不会
# 第一片序列数
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8
#切片duration控制hls_time
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 3 output1.m3u8
# 设置前置路径
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_base_url http://12.11.1.0/live/ output.m3u8
# 切片文件名规则
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_segment_filename lala-%d.ts output.m3u8
# hls_flags--delete_segments删除不在m3u8列表的旧文件
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_segment_filename lala-%d.ts -hls_flags delete_segments -hls_list_size 2 output.m3u8
# m3u8结束不追加endlist
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_segment_filename lala-%d.ts -hls_flags omit_endlist output.m3u8
#本地时间为切片名
ffmpeg -re -i ../out_10.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -use_localtime 1 output.m3u8
(2) segments+ss+t切片
#指定切片文件格式,segment_format指定为mp4,也可以是flv
ffmpeg -re -i video_3_audio_3.mp4 -c copy -f segment -segment_format mp4 qie/test_out-%d.mp4
#指定切片索引列表segment_list_type和segment_list,这样的m3u8不能播放,还可以索引为 csv文件、flat文件、ffconcat文件
ffmpeg -re -i out-10.mp4 -c copy -f segment -segment_format mp4 -segment_list_type m3u8 -segment_list output.m3u8 test_output-%d.mp4
#切片时间戳归0
ffmpeg -re -i ../out_10.mp4 -c copy -f segment -segment_format mp4 -reset_timestamps 1 test_output-%d.mp4
#查看时间戳
ffprobe -v quiet -show_packets -select_streams v test_output-0.mp4|grep pts_time|tail -n 3
ffprobe -v quiet -show_packets -select_streams v test_output-1.mp4|grep pts_time|head -n 3
#但是切片为ts,使切片时间归0不生效
#时间点切分segment_times,在offset为2s,5s,8s切割
ffmpeg -re -i ../out_10.mp4 -c copy -f segment -segment_format mp4 -segment_times 2,5,8 test_output-%d.mp4
#时长切分segment_time
ffmpeg -re -i ../out_10.mp4 -c copy -f segment -segment_format mp4 -segment_time 3 test_la-%d.mp4
#查看时长
ffprobe -v quiet -show_format test_la-0.mp4 | grep duration;ffprobe -v quiet -show_format test_la-1.mp4 | grep duration;ffprobe -v quiet -show_format test_la-2.mp4 | grep duration;ffprobe -v quiet -show_format test_la-3.mp4 | grep duration
#ss指定截取开始时间,截取第10s开始的数据
ffmpeg -re -i video_3_audio_3.mp4 -c copy -f mp4 -ss 10 qie/out-10.mp4
#t指定截取时长,截取开始的10s文件
ffmpeg -re -i video_3_audio_3.mp4 -c copy -f mp4 -t 10 qie/out-10.mp4
#output_ts_offset指定输出start_time
ffmpeg -re -i ../out_10.mp4 -c copy -output_ts_offset 120 oo.mp4
ffprobe -v quiet -show_format oo.mp4 |grep start_time
6、帧率变化场景
问题:直播流hls转封装MP4做收录操作时,客户反馈转出文件有倍速情况(源文件时长是117分钟,转出45分钟),后半部分没有数据情况
原因:源文件有帧率突增,时间戳跳变
将片转封装为mp4看帧率
ffmpeg -i hls的源文件地址 -c copy -copyts -f flv big_frames_pts_back.flv
工具分析:转出的文件
转出文件:vlc是音频时间戳为轴,所以会有倍速的效果
ffplay -ss 1200 test.flv (ffpaly也是一样的效果)
修正:-acodec copy -bsf:a aac_adtstoasc -vcodec copy -copyts这里主要使用copyts参数修复
如果转码是么问题的:-filter_complex [0:v:0]scale=1280:1080 -sn -dn -timestamp now -acodec libfdk_aac -ab 64k -ar 44100 -profile:a aac_low -ac 1 -fflags ignidx -vcodec libx264 -pix_fmt yuv420p -vb 1542150 -movflags +faststart
7、检测时间戳回退脚本
sh 脚本 源 dts 检测dts是否回退
sh 脚本 源 pts 检测pts是否回退
#/bin/sh
#$1输入流或文件
ffprobe -v quiet -i $1 -show_frames -show_packets -print_format csv > ffprobe.txt
cat ffprobe.txt |grep "packet,video" |awk -F , '{print "dts="$6 ,"pts="$4,"size="$12}' >temp1.txt
cat ffprobe.txt |grep "frame,video"|awk -F , '{print "frame_type="$19}' >temp2.txt
paste temp1.txt temp2.txt > ffprobe.txt
rm -rf temp1.txt temp2.txt
## 判断pts、dts是否存在回退现象
if [ $2 == "pts" ];then
cat ffprobe.txt |awk '{print $2}'|awk -F pts= '{print $2}'|sed '/^\s*$/d'|awk 'BEGIN {count=1;} {name[count] = $1;count++;}; END { for (i = 1; i < NR; i++) {if (name[i] >= name[i+1]) {print NR,i,"pts="name[i],"ERROR"} } }' > pts-error.txt
## 判断时间戳倒退得帧是否为B帧
num=`cat pts-error.txt |wc -l`
echo $num
for ((i=1;i<=$num;i++))
do
pts_time=`cat pts-error.txt|sed -n "$i"p|awk '{print $3}'`
#echo $pts_time
frame_type=`cat ffprobe.txt|grep -w $pts_time|awk -F "frame_type=" '{print $2}'`
if [ $frame_type == "B" ];then
usleep
else
echo $pts_time "frame_type="$frame_type
fi
done
elif [ $2 == "dts" ];then
cat ffprobe.txt |awk '{print $1}'|awk -F dts= '{print $2}'|sed '/^\s*$/d'|awk 'BEGIN {count=1;} {name[count] = $1;count++;}; END { for (i = 1; i < NR; i++) {if (name[i] >= name[i+1]) {print NR,i,"dts="name[i],"next_dts="name[i+1],"ERROR"} } }'
else
echo "common"
fi
8、推流、拉流
(1)推流
ffmpeg -re -i 源文件 -acodec copy -vcodec copy -f flv rtmp://10.100.51.88/videoqa.uplive.ks-cdn.com/live/test # 转推直播流,vframes控制多少帧播放 -copyts控制不修改pts ffmpeg -i rtmp://10.208.10.19:1937/douyin.live.ks-cdn.com/game/11 -acodec copy -vcodec copy -vframes 900 -copyts -f flv rtmp://10.100.51.88/videoqa.uplive.ks-cdn.com/live/22 #转码后推直播流 ffmpeg -re -i gifshow-265.flv -acodec copy -vcodec libqy265 -vf fps=30 -vb 1000k -vframes 900 -f flv rtmp://10.100.51.88/videoqa.uplive.ks-cdn.com/live/$1 # 推多路直播流 ffmpeg -re -i testfile/LIVE-SD.mp4 -c copy -f flv rtmp://10.100.51.178:1936/videoqa.uplive.ks-cdn.com/live/lala3 & ffmpeg -re -i testfile/LIVE-SD.mp4 -c copy -f flv rtmp://10.100.51.178:1938/videoqa.uplive.ks-cdn.com/live/lala4 ffmpeg -re -i testfile/LIVE-SD.mp4 -c copy -f flv rtmp://10.100.51.178:1939/hf-ws.uplive.ks-cdn.com/hfshow/hf -c copy -f flv rtmp://10.100.51.178:1939/hf-ws.uplive.ks-cdn.com/hfshow/hf1#循环推一个源文件
ffmpeg -re -stream_loop -1 -i '/home/hanfang1/.virtualenvs/zhuanma_hf/zhuanma//testData/zhibo/video_file/test.mp4' -c copy -f flv rtmp://10.111.6.220:1936/qa-ws.test-uplive.ks-cdn.com/qapress/hf1
(2)拉流
(1)curl方式:只能http协议
curl "http://202.108.39.241/flv?app=live&stream=drmcctv6_1_500" -o aaa.flv -v
tips:查看curl支持的协议范围
curl -V
(2)ffmpeg方式
ffmpeg -re -i rtmp://SingaporeVideoqa.live.ks-cdn.com/pulltrans/hf3wwwww -c copy -f flv -y qatest007.flv
(3)wget方式:liunx环境下,window下无wget,不支持rtmp协议
wget 'http://10.100.51.165:80/hfshow/hf1_suffixcase001_1.flv?vhost=hf-ws.test-live.ks-cdn.com' -O hf1_suffixcase001_1.flv
(4)ffplay方式:
ffplay http://10.100.51.178:8084/hfshow/hf.flv?vhost=hf-ws.live.ks-cdn.comffplay -i rtmp://kscvr-rtmplive.kscvbu.cn:1935/live_tran/800
(5)rtmpdump方式:
rtmpdump --timeout 10 -v -r rtmp://10.100.51.178:1939/hfshow?vhost=hf-ws.live.ks-cdn.com/hf?task_type=vodtran -o 10928.flv
9、图片转视频转gif
#-r 为1秒5帧,%d代表0,1,2...
ffmpeg -r 5 -i zhn_%d.png video.avi
#avi转gif
ffmpeg -i video.avi -pix_fmt rgb24 out.gif
制作的效果
10、流header信息
curl -I "流的url链接"
不同的文件类型,Type类型不同,类型不对,造成播放器播放有问题,有需要网页播放的客户等
Transfer-Encoding: chunked
直播m3u8的头中使用,保证content-length没有办法给出准确值情况
11、选流规则
流一般有:音频流,视频流,数据流,字幕流 四种
还有多路场景:多路音频流,多路视频流
选流:播放器是如何选择那一路视频流播放?那一路音频播放?
转码选流:视频流转码,选取一路视频流转码输出的(我司策略)
12、浏览器播放
(1)chrome调式音视频的工具:chrome://media-internals/
ffrobe验证一致,但是火狐可以播放
(2)