![使用 FFmpeg 将 MXF 转换为 MPEG 格式](https://linux22.com/image/1353551/%E4%BD%BF%E7%94%A8%20FFmpeg%20%E5%B0%86%20MXF%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20MPEG%20%E6%A0%BC%E5%BC%8F.png)
我们正在尝试在 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