最近下载了一些老电视剧(倚天屠龙记2000吴启华),因为格式比较旧,粤语和汉语不是放在不同音轨,而是放在一个音轨的左右声道。这样每次播放都需要设置声道,比较麻烦;并且在手机上用开源播放器vlc也不能设置。考虑用ffmpeg分离左右声道,把粤语和汉语放在不同音轨。
第一步,把视频转成MP4,因为rmvb格式编码比较特殊,直接处理其中音频比较难
ffmpeg -i 01.rmvb -s 512*384 -c:v h264_nvenc -b:v 768k -bufsize 1014k -preset default 01tmp.mp4
第二步,提取其中音频,这时音频已经由real的cock编码变成aac
ffmpeg -i 01tmp.mp4 -vn -acodec copy 01.aac
第三步,将音频左右声道分开,用到ffmpeg的map_channel
ffmpeg -i 01.aac -map_channel 0.0.0 01left.aac -map_channel 0.0.1 01right.aac
第四步,将分离开的音频添加到视频音轨,忽略原来的音频
ffmpeg -i 01tmp.mp4 -i 01left.aac -i 01right.aac -map 0:v -map 1:a -c copy -map 2:a -c copy -shortest 01.mp4
-map 0:v即使用第0个输入文件的视频,-map 1:a -c copy -map 2:a -c copy,即利用第1和第2个输入文件的音频复制
下面是完整代码
ffmpeg -i 01.rmvb -s 512*384 -c:v h264_nvenc -b:v 768k -bufsize 1014k -preset default 01tmp.mp4
ffmpeg -i 01tmp.mp4 -vn -acodec copy 01.aac
ffmpeg -i 01.aac -map_channel 0.0.0 01left.aac -map_channel 0.0.1 01right.aac
ffmpeg -i 01tmp.mp4 -i 01left.aac -i 01right.aac -map 0:v -map 1:a -c copy -map 2:a -c copy -shortest 01.mp4
rm 01.aac
rm 01tmp.mp4
rm 01left.aac
rm 01right.aac
以上过程中,第一步用到CUDA GPU的视频编码,而其他步主要用CPU,如果优化下可以用流水线之类优化一下;另外同时执行4个任务也基本可行。