前段时间,在回答知乎网友的问题时,碰到一个如下的问题:
当时,没有多加思考,直接使用了deepseek回答给了网友,但是事后发现不太对,所以在多番尝试后,转换RMVB成功, 今天正好有空,和大家分享探究过程,方便以后同学们自己编写ffmpeg命令时,有一个可行的尝试思路。
首先,rmvb转mp4的命令网上有很多,我就不再尝试了,具体看如下博文:
ffmpeg之rmvb文件处理(rmvb格式、变码率文件格式)(RealMedia Variable Bitrate)https://blog.csdn.net/Dontla/article/details/134888682 里面的命令我没测试过,我看了下,应该可以使用,就是复制原始流或编码成h264的mp4格式两种命令。
我们现在来说说今天的重点,MP4视频转RMVB视频,RMVB格式是我们80、90后的老朋友了,记得VCD和DVD还在流行的年代,日本动画片、电视剧都是用的这种压缩格式,RealOne——80后的应该都知道吧,承载了我们儿时的满满回忆。没想到20年后的今天,又看到这种格式了,真的是唏嘘不已啊!
不多说废话了,先来解决问题吧!搜索了下外网,只有一个可用的帖子,链接就不给了,你们可能也访问不了,截图如下:
就是这个命令:
ffmpeg -i input.mov -g 12 -r 30 -s qcif -ac 1 -vcodec rv20 -acodec real_144 -f rm output.rm
试了下,可以用,但是会报警告,如下:
请原谅,我是在虚拟机中试的,所以是WIN8系统,但是这个问题和什么系统无关,稍后会讲到。注意:原命令是mov格式,需要改成mp4。
转换后用potplay能打开视频,但是没有声音。而且视频很模糊,和原视频天差地别。
分析了下这个老外的命令,还是有参考价值的,他用到了视频编码器rv20和音频编码器real_144,询问chatgpt和deepseek,提示有更新版本的rv40和real_288可用,但是使用如下命令查询这两个都没有编码功能,只有解码,如下所示:
可以看到上面的红色栏是编解码器的类型,如下:
D..... = Decoding supported(解码器)
.E.... = Encoding supported(编码器)
..V... = Video codec(视频编解码器)
..A... = Audio codec(音频编解码器)
..S... = Subtitle codec(字幕编解码器)
...I.. = Intra frame-only codec(仅支持帧内编码的编解码器)
....L. = Lossy compression(有损压缩)
.....S = Lossless compression(无损压缩)
上面的字母需要结合起来看,比如rv30是D.V.L.,那么就是只有解码的有损视频编码器,而rv20多了一个E,所以是也就多了编码功能,我们一般只要看DEVA这几个就行,所以视频编码器,我们只能选择rv20和rv10这两个编码器,rv10有点太久远了,还是rv20,所以上面的那个老外命令是对的,同样的音频编码器,只能能选ra_144,而不能选ra_288(没有编码功能)。
那么老外的哪些个其他参数有什么用哪?请使用如下命令探究:
ffmpeg -h encoder="rv20"
可以看到,rv20的格式使用的所有参数,如果看不懂,可以丢到deepseek里面去,让它帮你解释下。
对于视频参数,我们只要知道视频的分辨率和码率即可,问下deepseek马上就有了范围:
我们可以编写出如下的命令:
ffmpeg -i input.mp4 -c:v rv20 -b:v 500k -g 25 -vf "scale=1280:720" output.rmvb
当然上面还不是最终命令,我先解释下:
-c:v rv20 使用rv20视频编码器
-b:v 500k 使用视频码率 500k(这个码率需根据实际视频调整,如出错需设置的小一点)
-g 25 调整 GOP 大小为25,这个参数可以压缩视频,让分辨率更大
-vf "scale=1280:720" 缩放视频分辨率到720P(这个分辨率已经差不多是极限了,大家可以测试反馈下)
如下图,使用-b:v 500k码率报错"Muxing packets larger than 64kb",这时我们可以调小这个500k到400k或更小,根据你实际的情况修改这个值
同样的,运行如下命令,可以看ra_144的音频编码说明:
然后根据deepseek的说明,我们很快得到了ra_144的音频部分的代码:
ffmpeg -i C:\Users\Dong\input.mp4 -vn -c:a ra_144 -ar 8000 -ac 1 -f rm output.rmvb
-vn 忽略视频编码部分(这里只测试音频)
-c:a ra_144 使用ra_144音频编码
-ar 8000 根据上面的 "Supported sample rates: 8000"说明设置
-ac 1 根据deepseek可知,ra_144是单声道,所以设置成这个
-f rm 是设置输出格式为rm
但是运行上面的命令后,我的ffmpeg有一个警告,如下:
"overflow. Broken sample",这个问题试了很多遍没有解决,gpt和deepseek也没有办法,搜了下外网,有一个外国人也碰到过,解决的方法就是更新下ffmpeg的版本,看了下自己的版本才2018年的v4.0.2,现在已经到了2025年的v14.2.0,运行了下,果然不报错了,如下:
整合了下所有代码,最终可用命令如下:
ffmpeg -y -i input.mp4 -c:v rv20 -b:v 400k -g 25 -vf "scale=1280:720" -c:a ra_144 -ar 8000 -ac 1 -f rm output.rmvb
请把input.mp4替换成自己的输入文件路径。
最后还有个小问题,使用potplay播放这个生成的rmvb是没有声音的,单独播放刚刚生成的音频也是不能解码的,所以肯定是potplay的问题,使用ffplay都可以播放视频和音频,但是没有进程条,不能拖动位置,这个问题换个播放器,比如vlc(https://www.videolan.org/vlc/)就能解决。
给一个播放成功的图片为证:
最新的ffmpeg程序我稍后会上传百度云盘和csdn,谢谢大家观看,再见!
百度云:
通过网盘分享的文件:MP4转RMVB
链接: https://pan.baidu.com/s/1yI29gYR2I4z0hQSqY6oYPw?pwd=v9u5 提取码: v9u5