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

相关推荐
qq_316837752 小时前
使用ffmpeg 将图片合成为视频,填充模糊背景,并添加两段音乐
ffmpeg·音视频
林鸿群6 小时前
Mediamtx与FFmpeg远程与本地推拉流使用
ffmpeg
unix2linux2 天前
YOLO v5 Series - FFmpeg & (HTML5 + FLV.js ) & ONNX YOLOv5s Integrating
yolo·ffmpeg·html5
Antonio9152 天前
【音视频】FFmpeg解封装
ffmpeg·音视频
Antonio9152 天前
【音视频】FFmpeg内存模型
ffmpeg·音视频
hjjdebug2 天前
全面介绍AVFilter 的添加和使用
ffmpeg·avfilter
邪恶的贝利亚2 天前
基于 FFmpeg 的音视频处理基础原理与实验探究
ffmpeg·音视频
Antonio9152 天前
【音视频】AAC-ADTS分析
ffmpeg·音视频·aac
这被禁忌的游戏3 天前
网页下载的m3u8格式文件使用FFmpeg转为MP4
ffmpeg
hunandede3 天前
ffmpeg 硬解码相关知识
ffmpeg