使用 FFmpeg 将 MXF 转换为 MPEG 格式

使用 FFmpeg 将 MXF 转换为 MPEG 格式

我们正在尝试在 ffmpeg-0.9.2 上将 .mxf 视频转换为 .mpeg,但看起来 0.9.2 版本不支持将 .mxf 转换为 .mpeg。

我们不想使用最新的 0.11 版 ffmpeg,因为最新版本的视频效果太差了。也许我们没有使用正确的命令来转换 .mxf 格式。

以下是转换命令的错误:

[root@localhost ~]# ffmpeg -i test.mxf  -ac 2 output.mpg                                                                                     ffmpeg version 0.9.2-syslint, Copyright (c) 2000-2012 the FFmpeg developers
  built on Mar  1 2013 22:34:33 with gcc 4.6.3
  configuration: --prefix=/usr/local/cpffmpeg --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --enable-libopencore-amrnb --enable-decoder=liba52 --enable-libopencore-amrwb --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --extra-cflags=-I/usr/local/cpffmpeg/include/ --extra-ldflags=-L/usr/local/cpffmpeg/lib --enable-version3 --extra-version=syslint
  libavutil    51. 32. 0 / 51. 54.100
  libavcodec   53. 42. 4 / 53. 42. 4
  libavformat  53. 24. 2 / 53. 24. 2
  libavdevice  53.  4. 0 / 53.  4. 0
  libavfilter   2. 53. 0 /  2. 77.100
  libswscale    2.  1. 0 /  2.  1.100
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mxf, from `test.mxf`:
  Duration: 00:00:07.04, start: 0.000000, bitrate: 62580 kb/s
    Stream #0:0: Video: mpeg2video (4:2:2), yuv422p, 720x608 [SAR 608:405 DAR 16:9], 50000 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, 8 channels, s16, 6144 kb/s
File `output.mpg` already exists. Overwrite ? [y/N] y
Incompatible pixel format `yuv422p` for codec `mpeg1video`, auto-selecting format `yuv420p`
[buffer @ 0x8476e0] w:720 h:608 pixfmt:yuv422p tb:1/1000000 sar:608/405 sws_param:
[buffersink @ 0x847b80] auto-inserting filter `auto-inserted scaler 0` between the filter `src` and the filter `out`
[scale @ 0x848220] w:720 h:608 fmt:yuv422p sar:608/405 -> w:720 h:608 fmt:yuv420p sar:608/405 flags:0x4
[mpeg @ 0x84a7a0] VBV buffer size not set, muxing may fail
Output #0, mpeg, to `output.mpg`:
  Metadata:
    encoder         : Lavf53.24.2
    Stream #0:0: Video: mpeg1video, yuv420p, 720x608 [SAR 608:405 DAR 16:9], q=2-31, 200 kb/s, 90k tbn, 25 tbc
    Stream #0:1: Audio: mp2, 48000 Hz, 2 channels, s16, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> mpeg1video)
  Stream #0:1 -> #0:1 (pcm_s16le -> mp2)
Press [q] to stop, [?] for help
[buffer @ 0x8476e0] Changing frame properties on the fly is not supported.
Failed to inject frame into filter network

答案1

您确定要 MPEG-1 视频吗?您的命令将视频重新编码为 1993 年发布的标准。如果质量不如您预期,我不会感到惊讶。

您的源文件包含 MPEG-2 视频和 PCM 音频,因此理想情况下您应该将其合并到 MPEG-2 容器中:

ffmpeg -i in.mxf -c copy out.mpg

这不会重新编码音频和视频,因此您不会在此过程中损失质量。

除此之外,自 0.5 版起,FFmpeg 应该完全支持 MXF 解复用。如果您在转码时仍然遇到错误,并且您要转码而不是仅仅复制流,请尝试下载最近的静态构建从 FFmpeg 主页上查找适合您的操作系统的版本。

这会将视频重新编码为 MPEG-2,变量质量为 2(合理值为 2-5,范围为 1-31,值越低越好):

ffmpeg -i in.mxf -c:v mpeg2video -qscale:v 2 -c:a mp2 -b:a 128k out.mpg

当然,您也可以使用恒定比特率编码:

ffmpeg -i in.mxf -c:v mpeg2video -b:v 2M -c:a mp2 -b:a 128k out.mpg

相关内容