音视频造数据的路

目录

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目录


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.com

ffplay -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类型不同,类型不对,造成播放器播放有问题,有需要网页播放的客户等

HTTP content-type | 菜鸟教程

Transfer-Encoding: chunked 

直播m3u8的头中使用,保证content-length没有办法给出准确值情况

11、选流规则

流一般有:音频流,视频流,数据流,字幕流 四种

还有多路场景:多路音频流,多路视频流

选流:播放器是如何选择那一路视频流播放?那一路音频播放?

转码选流:视频流转码,选取一路视频流转码输出的(我司策略)

12、浏览器播放

(1)chrome调式音视频的工具:chrome://media-internals/

ffrobe验证一致,但是火狐可以播放 

(2)

  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值