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

相关推荐
浩瀚之水_csdn11 小时前
av_packet_alloc详解
ffmpeg
Echo_NGC22371 天前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
xmRao2 天前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao2 天前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
阿里巴啦3 天前
python+yt-dlp开源项目,支持 YouTube, Bilibili, TikTok/抖音,快手 等多个平台的视频/音频/字幕下载/ai摘要等功能
python·ffmpeg·whisper·音视频·视频处理·ai摘要·音视频转录
来鸟 鸣间4 天前
linux下ffmpeg源码编译
linux·运维·ffmpeg
Echo_NGC22374 天前
【FFmpeg使用指南】Part 2:滤镜图架构与信号处理
架构·ffmpeg·音视频·信号处理
Echo_NGC22374 天前
【FFmpeg使用指南】Part 1:核心架构与媒体流处理
ffmpeg·音视频·媒体·视频
ssxueyi4 天前
用 Claude Code 从零开发自己的Direct3D 硬件加速播放器
ffmpeg·ai编程·directx·视频播放器·从零开始·claude code·csdn征文活动
Yan_uuu4 天前
ubuntu18.04 安装 x264、ffmpeg、nv-codec-hearers 支持GPU硬件加速
c++·图像处理·ubuntu·ffmpeg