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的滤镜链.

相关推荐
winfredzhang13 小时前
实战:从零构建一个支持屏幕录制与片段合并的视频管理系统 (Node.js + FFmpeg)
ffmpeg·node.js·音视频·录屏
winfredzhang14 小时前
自动化视频制作:深入解析 FFmpeg 图片转视频脚本
ffmpeg·自动化·音视频·命令行·bat·图片2视频
胖_大海_2 天前
【FFmpeg+Surface 底层渲染,实现超低延迟100ms】
ffmpeg
冷冷的菜哥2 天前
springboot调用ffmpeg实现对视频的截图,截取与水印
java·spring boot·ffmpeg·音视频·水印·截图·截取
进击的CJR2 天前
redis哨兵实现主从自动切换
mysql·ffmpeg·dba
huahualaly2 天前
重建oracle测试库步骤
数据库·oracle·ffmpeg
aqi002 天前
FFmpeg开发笔记(九十九)基于Kotlin的国产开源播放器DKVideoPlayer
android·ffmpeg·kotlin·音视频·直播·流媒体
lizongyao3 天前
FFMPEG命令行典型案例
ffmpeg
冷冷的菜哥3 天前
ASP.NET Core调用ffmpeg对视频进行截图,截取,增加水印
开发语言·后端·ffmpeg·asp.net·音视频·asp.net core
冷冷的菜哥3 天前
go(golang)调用ffmpeg对视频进行截图、截取、增加水印
后端·golang·ffmpeg·go·音视频·水印截取截图