0%

ffmpeg合并音视频

ffmpeg常用方法

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

合并音视频的简单方法

从youtube拔下来的高清视频不带音频,视频和音频是分开,通过ffmpeg进行合并

1
2
3
4
5
6
#去除视频原有声音
ffmpeg -i videoplayback.mp4 -vcodec copy –an audioLess.mp4
#合并视频和音频
ffmpeg -i audioLess.mp4 -i sampleAudio.mp3 -c copy output.mp4
# 打开看一眼
ffplay output.mp4

注: -i 输入要处理的视频文件路径
     -an 不使用音频纪录
     -vcodec 视频强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。
     -acodec 音频强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。

m3u8(ts) 合并为 MP4

远程文件
以优酷为例,f12,network 搜索.m3u8

1
ffmpeg -i "./soft/ffmpeg/bin/ffmpeg.exe -i "https://valipl.cp31.ott.cibntv.net/6572E86C4674971FC06842811/0300090000631AB5A872945696B9167FC09D41-4CD7-4F34-B7EF-6F3848FAEE9F-11-19002.m3u8?ccode=0502&duration=10382&expire=18000&psid=acf24e1cec483c5e0ab5c18c9618f78641346&ups_client_netip=2001x470xcx7cxx2&ups_ts=1664697844&ups_userid=&utid=h1PnFptjbB0CAWp46ELD3fcH&vid=XNTg5OTg1OTkyNA%3D%3D&vkey=B56777484cee4bbb530a440822c040791&s=adac380a5e1d4a2f9380&eo=0&t=b5efbfeabc8d80e&cug=1&fms=a12b6356ee2fc783&tr=180&le=338a5a7f8e40b2c7389bf6f58a9c2595&ckt=5&m_onoff=0&rid=200000009EA308D5E433EBF10D7F75DD0BAA0D3502000000&type=mp4hd3v3&bc=2&dre=u37&si=73&dst=1&sm=1&operate_type=0" -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4" -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4

本地文件

1
2
3
4
5
# 合并成 ts 文件 
copy /b F:\f\*.ts E:\f\new.ts

#合并成 MP4 文件
copy /b F:\f\*.ts E:\f\new.MP4

ffmpeg

1
2
3
4
5
6
7
8
9
10
11
# 未验证
ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,https,crypto,tcp" -i D:/01_doc/mp4/test/index.m3u8 -c copy D:/01_doc/mp4/test/out.mp4

#直接转
ffmpeg -i new.ts -c copy -map 0:v -map 0:a output.mp4

#指定音频流(一般用这个)
ffmpeg -i new.ts -c copy -map 0:v -map 0:a -bsf:a aac_adtstoasc output.mp4

#重编码视频
ffmpeg -y -i new.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc output.mp4
MP4 转 M3U8

M3U8 是 Unicode 版本的 M3U,用 UTF-8 编码。”M3U” 和 “M3U8” 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。
简单来说,m3u8是一个视频格式,就是将一个视频分成很多的小部分,这样方便视频的加载。

操作简单,但效率低
1
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 2 -hls_time 15 output.m3u8

生成的效果是:

将 input.mp4 视频文件每 15 秒生成一个 ts 文件,最后生成一个 m3u8 文件,m3u8 文件是 ts 的索引文件。

我们直接用 VLC media player 等播放软件是可以直接打开 m3u8 文件,像播放 mp4 一样。

默认的每片长度为 2 秒,m3u8 文件中默认只保存最新的 5 条片的信息,导致最后播放的时候只能播最后的一小部分(直播的时候特别注意)。
-hls_time n 设置每片的长度,默认值为 2,单位为秒。
-hls_list_size n 设置播放列表保存的最多条目,设置为 0 会保存有所片信息,默认值为5。
-hls_wrap n 设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0。这个选项能够避免在磁盘上存储过多的 片,而且能够限制写入磁盘的最多的片的数量。
-hls_start_number n 设置播放列表中 sequence number 的值为 number,默认值为 0。
注意:播放列表的 sequence number 对每个 segment 来说都必须是唯一的,而且它不能和片的文件名(当使用 wrap 选项时,文件名有可能会重复使用)混淆。

效率优化版,提升效率

TS 文件是一种媒体的扩展名,它是日本高清摄像机拍摄下进行的封装格式。MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS 或 M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

1
2
3
4
5
6
7
# 视频整体转码ts
ffmpeg -y -i music.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out\music.ts
# ts 文件切片
ffmpeg -i music.ts -c copy -map 0 -f segment -segment_list out\music.m3u8 -segment_time 10 out\15s_%3d.ts

#hls_time 切片时间不准确的问题
ffmpeg -i test.mp4 -force_key_frames "expr:gte(t,n_forced*2)" -strict -2 -c:a aac -c:v libx264 -hls_time 2 -f hls index.m3u8