其实这个无损是相对无损,不是绝对无损
因为mkv封装支持的格式、标签等是比mp4封装要多的
比如mkv可以封装wav音频,mp4不能封装wav音频
所以这里的无损的前提是该mkv的媒体流、标签(TAG)、封面图等,都是Mp4本身支持的
才能无损转换
我以前长期使用一个bat
ffmpeg.exe -i "%~1" -vcodec copy -acodec copy "%~dpn1".mp4
这个命令就是无损转换mkv到mp4的,其中的-vcodec copy为视频流直接拷贝, -acodec copy是音频流直接拷贝
不过这个命令有一个很大的缺点,那就是仅仅拷贝视频流、音频流,但是标签、章节、封面图等会丢失
所以后面做了一个改进
rem 首先提取元数据到metadata.txt
bin\ffmpeg -i "%~1" -f ffmetadata -y metadata.txt
rem 然后把metadata.txt元数据作为输入源进行添加
bin\ffmpeg.exe -i "%~1" -i metadata.txt -map 0 -vcodec copy -acodec copy -y "%~dpn1".mp4
这里很重要的一个参数是-map 0(意思是把视频流映射为第0个媒体流)这个代码绝对不能少,不进行map的话,会导致封面图丢失,我之前就是因为没有加-map 0导致封面图丢失,困扰了我很久,结果一个小小的代码就解决了
这里要说明的是因为mkv和mp4本身有差异,mp4无法导入mkv的xml文件,只能退而求其次通过先导出metadata.txt的方法再导入,metadata.txt里面包含的信息并不完全,会丢失专辑名和年份信息.不过艺术家、标题等会被保留.