FFmpeg不进行不必要的muxing

FFmpeg不进行不必要的muxing,ffmpeg,h.264,codec,aac,video-conversion,Ffmpeg,H.264,Codec,Aac,Video Conversion,我正在写一个脚本,它将MKV或AVI等视频文件转换为MP4,然后从网络流媒体中准备它们。我希望我的输出使用H.264和AAC编解码器 到目前为止,我的命令如下所示: ffmpeg -i input.mkv -vcodec h264 -acodec aac -ab 128k -ac 2 -strict -2 output.mp4 然而,当编解码器已经是h.264时,它仍然对其进行多路复用,它说:(h264->libx264) 如果我将'-vcodec h264'替换为'-vcodec copy'

我正在写一个脚本,它将MKV或AVI等视频文件转换为MP4,然后从网络流媒体中准备它们。我希望我的输出使用H.264和AAC编解码器

到目前为止,我的命令如下所示:

ffmpeg -i input.mkv -vcodec h264 -acodec aac -ab 128k -ac 2 -strict -2 output.mp4
然而,当编解码器已经是h.264时,它仍然对其进行多路复用,它说:(h264->libx264)

如果我将'-vcodec h264'替换为'-vcodec copy',当编解码器为H.264时,速度会快得多,但如果输入文件中有不同的编解码器,当然不会更改编解码器


FFmpeg是否有办法识别编解码器几乎相同,因此不会对视频流进行多路复用,但如果源不是H.264,则仍会更改视频编解码器?

否。FFmpeg只能复制比特流或重新编码。它无法猜测你是否想保留某个编解码器。您必须解析文件信息,然后决定是否要复制

下面列出了一些如何做到这一点的示例:

基本上,您可以这样做(来自@evilsoup的无耻插件):

这将为H.264视频流输出
h264

小提示:尝试习惯于指定您想要的确切编码器
h264
实际上不是FFmpeg的编码器–它默认为
libx264
。因此,宁可使用
-c:v libx264


还有一件事:
aac
是来自FFmpeg的内置aac编码器。像
libfdk_aac
libfaac
这样的第三方编码器提供了一种VBR编码模式,并且通常比
aac

更好的质量。FFmpeg只能复制比特流或重新编码。它无法猜测你是否想保留某个编解码器。您必须解析文件信息,然后决定是否要复制

下面列出了一些如何做到这一点的示例:

基本上,您可以这样做(来自@evilsoup的无耻插件):

这将为H.264视频流输出
h264

小提示:尝试习惯于指定您想要的确切编码器
h264
实际上不是FFmpeg的编码器–它默认为
libx264
。因此,宁可使用
-c:v libx264


还有一件事:
aac
是来自FFmpeg的内置aac编码器。第三方编码器,如
libfdk_aac
libfaac
提供了一种VBR编码模式,通常比
aac
质量更好。在将视频传递给ffmpeg之前,您必须对其进行分析。如果已经是h264,则是mux,如果不是转码。在将视频传递到ffmpeg之前,您必须对其进行分析。如果已经是h264,那么是mux,如果不是转码的话。我担心我会做一个检查。但是非常感谢你的提示!!我担心我得做一个检查。但是非常感谢你的提示!!
ffprobe input.mkv 2>&1 | sed -n '/Video:/s/.*: \([a-zA-Z0-9]*\).*/\1/p' | sed 1q'