FFMPEG将flv转换为mp4,而不会损失质量[重复]


55

这个问题已经在这里有了答案:

目前,我正在将.flv Flash文件转换为.webm和.mp4文件,以用于HTML5视频播放器。

_

我对WEBM使用以下ffmpeg命令:ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm 该命令运行良好,文件大小保持相对不变(重要)。

_

对于MP4,我正在使用以下内容: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

它可以转换为.mp4 fine,并可以防止任何质量损失,但是文件大小几乎增加了两倍。

可以使用哪种ffmpeg公式将其转换为MP4,而又不会损失太多质量并防止文件大小变大?

Answers:


57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

您必须指定使用的视频编解码器。在您的命令中,您没有指定-vcodec-c:v因此ffm​​peg使用MP4的默认编解码器(mpeg4),压缩效率不高。尝试改用libx264并设置CRF,这是质量级别(越低越好,默认值为23,并且理智的值在18到28之间)。

使用libx264编码有点复杂,因此您应该查阅H.264编码指南

您还需要指定-strict experimental否则可能会得到:“编码器'aac'是实验性的,但实验性编解码器未启用,如果要使用它,请添加'-strict -2'。”


1
这会花费很多时间,导致mp4失真严重,像素丢失等。为什么会有这样的想法?:/
trainoasis

mp4格式的默认视频编解码器不一定是mpeg4。根据ffmpeg --help muxer=mp4我机器上的输出,ffmpeg使用h264作为mp4的默认视频编解码器。
doubleDown

1
@doubleDown我的回答很旧-从2011年开始。从那时起,他们可能在某个时候更改了默认设置。
sashoalm 2015年

43

此命令仅更改容器而无需重新编码

ffmpeg -i input.flv -codec copy output.mp4

您知道一种制作用于批量转换同一文件夹中许多视频的脚本的方法吗?
ttoine

是的,在Windows上创建文件convert.bat并将其放在其中:for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4",然后在带有* .flv文件的文件夹中执行convert.bat
c97,11

1
对我来说,这引发无法为输出文件#0写入标头(错误的编解码器参数?):无效的参数。有任何想法吗?:/
trainoasis

2
@trainoasis您的.flv不包含H.264视频和AAC音频。-codec copy仅将音频和视频已经使用H.264和AAC编码的极少数情况下,才可以将未触及的音频/视频数据复制到.mp4文件中。参见superuser.com/a/1009539/390946addpipe.com/blog/flv-to-mp4
Octavian Naicu

3

avconvffmpeg在本质上是一样的。[从最近开始,有一些分歧,但是如果您自己编译,就没有太多要写的内容ffmpeg了。例如,Ubuntu存储库中提供的那个是OLD,并且受那个视频大小的困扰不是什么等等……[基本上是尝试告诉您视频的比例不正确],但是如果您不愿意阅读ffmpeg编译指南并从git进行编译,则大多数操作系统都不会遇到较早版本的问题。折旧警告指的avconv是告诉你,他们已经创建了一个新的UTIL去替代ffmpeg,但它是SO广泛使用,即使他们试图削减其关闭,我们会从所有被创建软链接avconvffmpeg 无论如何,这样他们就不会停止工作并放弃它。]]

使用它不是一件坏事avconv,我刚刚看到一个回答,其中提到了折旧警告,从本质上来说,这是一个空消息,对于ffpmeg的替代品,您可以尝试使用av​​conv,这在这种情况下更为真实。

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

确实是一样的

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

本质上,第一个使用的是操作简便的选项,第二个使用的是写得更多的选项。

ALSO -map 0也指的是音轨,因此,如果使用类似的mp4a方法可以很好地处理多条音轨,则可以将其保留下来以将所有音频流复制到生成的文件中。仅当使用在同一文件中不支持多个音轨的编解码器时才需要这样做,然后您才需要映射所需的音频而不是全部。当然,如果要尽量减少使用的空间,您可以只指定一个文件,以减小文件的大小[音频好像是视频轨道大小的1/3 [慷慨]]。

-c:v = codec(video)因此:-c:v libx264与使用:-vcodec libx264FYI 相同;与本示例相同:-c:v copy = -vcodec copy

此外,对于FLV,请注意flv文件与avi相同,因为它是一个容器,可以包含任意数量的视频或音频编解码器。您可能想先使用选择的媒体检查实用程序来查看文件本身中使用的内容,然后再选择只是复制视频和/或音频流,或者如果您想将其从原来的内容转换为新的东西。因此,最适合一个FLV的命令可能与另一个FLV并不相同(当然,通常,如果从同一个源获取多个FLV,它们将以相同的方式编码,但这绝不能保证)。

不尝试挑剔只是在网络搜索中遇到了这个问题,想尝试帮助人们澄清一些事情。

再次,由于此答案表示在此答案下方的答复,运行ffmpeg始终会发布该消息,该消息实际上是空心的,因为这两个实用程序实际上仍然只是相同的实用程序,差别很小。在几乎所有情况下,使用任一命令都应获得完全相同的结果。这不一定会导致完全重新转码,为什么?A,如果不需要,则可以节省大量时间; B,如果您将文件已重新压缩为视频编解码器,则可以对其进行重新转码,实际上,您是在对已压缩的文件运行压缩例程,并且总是会质量低于来源。大多数较新的编解码器在某种程度上是交叉兼容的(不是全部),例如flv在技术上可以是FLV包装器中的MP4,因为AVI之类的FLV只是其他编解码器的容器。所以,与您将其转换为视频和ausio编解码器的源flv是否需要进行代码转换相比,这取决于源。如果在FLV中他们使用H264 MP4视频和MP4a进行音频处理,则无需重新转码内容,只需将其复制并调整文件头,即可将其作为真正的MP4而不是MP4视频阅读在FLV文件中。


3

根据本指南,无需任何AV重新编码即可将FLV转换为MP4的正确命令是:

ffmpeg -i input.flv -c copy -copyts output.mp4

在所有情况下,对于AVC视频和AAC或MP3音频,它都非常适合我。


-1

使用ffmpeg时,我收到弃用警告,以使用avconv。使用avconv我得到了不错的结果:

avconv -i inputfile.flv -map 0 -c:v libx264 -c:复制outputfile.mp4

阅读man avconv以获取更多信息。


1
ffmpeg本身不被弃用。它看起来不错的原因是因为您指定了x264编码器,该编码器具有很好的质量默认设置。
slhck

-2

我建议您为该脚本创建一个shell脚本,其video_flv_to_mp4内容如下:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

然后像这样运行它:

$ video_flv_to_mp4 video.flv

它会给你一个video.flv.mp4文件。


4
-sameq不再是ffmpeg的有效选项。这也不意味着“相同的质量”。另请参阅这篇文章
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.