目录
1、多路数据制造
(1)合并多路
(2) 视频修改分辨率
(3) 修改视频码率
(4)修改帧率
2、音频流多声道合成
(1)双声道合并单声道
(2)双声道提取
(3) 双声道转双音频流
(4)单声道转双声道
(5)两路音频合并双声道
(6)合并多声道
(7) 声道和编码格式
2、视频相关处理
(1)查看视频信息
(2)造大帧文件
(3)造大gop的文件
(4) copyts参数
(5)视频参数修改
4、ffprobe使用
(1)查看duration
(2)查看时间戳
(3)查看时长
(4)查看视频关键帧
5、切片
(1)hls
(2) segments+ss+t切片
6、帧率变化场景
7、检测时间戳回退脚本
8、推流、拉流
(1)推流
(2)拉流
9、图片转视频转gif
ffmpeg -y -copyts -ss 1:49 -i ~/Videos/input.mkv -c copy -t 1:00 timing-1m49s.mkv目录
音频采样频率,单位: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
合并一个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
修改分辨率:
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
# 查看支持的声道布局
ffmpeg -layouts
# 查看ffmpeg支持的音频编码格式
ffmpeg -codecs|findstr Audio(windows下查看的)
ffmpeg -i input.aac -ac 1 output.aac
# 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
ffmpeg -i output.mp4 -filter_complex channelsplit=channel_layout=stereo -y test1111.mp4
# 提取一路mono的音频流
ffmpeg -i test1111.mp4 -map 0:0 ew.aac
# 转成双声道
ffmpeg -i ew.aac -ac 2 channel_2.aac
ffmpeg -i ew.aac -i ew.aac -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" channels_2.aac
# 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
# 合并声道,音频转码了
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
# 看是否是关键帧,帧大小,时间戳
ffprobe -v quiet -of compact -show_packets -select_streams v output.mp4
ffmpeg -i input.mp4 -vcodec libx264 -crf 0 -f mp4 output.mp4
# 无损但是帧并不是很大
obs设置帧间距20
产生一个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分片加载不准确
修改分辨率: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分钟的数据)
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
#liunx下,查看最后3个时间戳
ffprobe -v quiet -show_packets -select_streams v xuanzhuan.mp4 2> x|grep pts_time |tail -n 3
ffprobe -v quiet -show_format xuanzhuan.mp4|grep duration
ffprobe -v quiet -of compact -show_packets -select_streams v ../out_10.mp4 |grep K
只支持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
#指定切片文件格式,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
问题:直播流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
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
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
(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
#-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
制作的效果
不同的文件类型,Type类型不同,类型不对,造成播放器播放有问题,有需要网页播放的客户等
HTTP content-type | 菜鸟教程
Transfer-Encoding: chunked
直播m3u8的头中使用,保证content-length没有办法给出准确值情况
流一般有:音频流,视频流,数据流,字幕流 四种
还有多路场景:多路音频流,多路视频流
选流:播放器是如何选择那一路视频流播放?那一路音频播放?
转码选流:视频流转码,选取一路视频流转码输出的(我司策略)
(1)chrome调式音视频的工具:chrome://media-internals/
(2)