ffmpeg实现mvk到mp4的格式转换

本文记录在使用ffmpeg转换mkv格式的文件到mp4时的一些问题.

像素格式问题

常规的转换命令可能如下

bash 复制代码
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4

这里用libx264进行视频编码,aac进行音频编码,按道理是有很好的通用性的,但是笔者多次在转换后发现视频使用windows自带的播放器中根本无法播放,用VLC是可以正常的。因为之前遇到过像素格式的问题,就使用ffmpeg查看了mkv文件的像素格式,发现是yuv420p10le, 而比对后能正常播放的mp4,像素格式为yuv420p,因此指定参数-pix_fmt yuv420p即可.

音频问题

mkv格式视频转换为mp4后,很可能会遇到在部分播放器中没有声音的情况(部分播放器是只有背景音),这时需要分析音频流,下面用笔者遇到的情况举例。

在笔者的mkv文件中,有个2个音频stream,分别为背景音和人声。根据查到的一些资料,以为是播放器不能支持两个音频流,于是在转换过程中,把原来的两个音频流进行了合并,发现效果非常差,显然这不是一个好的解决方案,并且在部分正常的mp4文件中,也发现有两个音频流的情况。

换个思路,查看了音频流的声道情况,发现mkv文件的声道是6channel,推测很可能是根源,于是在转换过程加入参数-ac 2,将其转为2个声道,播放正常。

PS: 上面这个例子中,如果不转为2声道,在部分播放器上只有背景音,没有人声,根据网上资料来看,有些播放器在2个音频流的情况下,第二个音频流对6声道不支持,所以才出现了第一个音频流播放正常,第二个音频流不播放。

字幕问题

mkv通常带多语种字幕,可以自行选择,这些字幕也可以作为单独的流挂载到mp4中,但是部分播放器选择字幕的功能都不开放,只能进行burn-in。 解决办法是,自行提取需要的语种的字幕为srt文件, 然后在转换过程中,把srt文件burn-in到视频中。这种办法通用性很好,只要能播放就能显示字幕,弊端是用户也不能选择字幕了.

提取字幕的命令是如下格式

bash 复制代码
ffmpeg -i input.mkv -map 0:s:0 output.srt

完整的转换命令

bash 复制代码
ffmpeg -i input.mkv -vf subtitles=output.srt -map 0:v -map 0:a:0 -map 0:a:1 -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -crf 23 -c:a aac -b:a 192k -ac 2 -filter:a "volume=2.0" -movflags +faststart output.mp4

色差问题

这个问题发现通常是播放器不支持HDR导致的,现在不支持的播放器很少了,于是没有单独解决,如果需要转换hdr到sdr,可以使用ffmpeg的滤镜链.

相关推荐
cuijiecheng20181 小时前
音视频入门基础:MPEG2-PS专题(5)——FFmpeg源码中,解析PS流中的PES流的实现
ffmpeg·音视频
丘上人7 小时前
ffplay 命令行 从视频第N帧开始读取 ffmpeg 命令行 提取第N帧图片
ffmpeg·音视频
qq762118229 小时前
ffmpeg7.0 合并2个 aac 文件
c++·ffmpeg·aac
宿命小人1 天前
ffmpeg视频抽帧和合成
ffmpeg·音视频
丘上人1 天前
ffmpeg 命令行 重置音频或视频的时间戳
ffmpeg·音视频
我真不会起名字啊2 天前
“深入浅出”系列之FFmpeg:(1)音视频开发基础
ffmpeg·音视频
飘逸高铁侠2 天前
使用 whisper和ffmpeg 烧录视频的中英文双语字幕
ffmpeg·whisper·音视频
风雅GW2 天前
本地LLM部署--Open WebUI(多媒体工具FFMPEG作用)
gpt·ffmpeg·agi
cuijiecheng20182 天前
音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现
ffmpeg·音视频
丘上人2 天前
ffmpeg 常用命令
ffmpeg