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

相关推荐
LoyalToOrigin5 小时前
iOS 26 libass字幕渲染问题兼容解决实践
ios·ffmpeg·objective-c
siv7710 小时前
影视解说视频智能生产全链路方案解析:从脚本生成到多平台分发
ffmpeg·srt字幕·ai剪辑·影视解说·ai电影解说·视频自动切割·字幕文件解析
独占的甜蜜10 小时前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析过程
ffmpeg·whisper·音视频
独占的甜蜜10 小时前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频
JMchen1231 天前
集成第三方 C/C++ 库到 Android NDK 项目:OpenCV 与 FFmpeg 实战指南
opencv·ffmpeg·音视频开发·cmake·jni·ndk·abi 兼容性
qcx231 天前
【AI Agent实战】 0 成本视频处理全流程:ffmpeg + whisper 实现去水印、双语字幕、品牌片尾 | 实战SOP
人工智能·ffmpeg·音视频
huxiao_06011 天前
Windosw下VS 2022编译FFmpeg(支持x264、x265、fdk-acc)
ffmpeg·音视频
小驴程序源3 天前
TS 分片合并完整教程
python·ffmpeg
鬼蛟4 天前
Spring Cloud Alibaba
ffmpeg·bootstrap
米优4 天前
ffmpeg实现解码h264/h265裸码流
ffmpeg