嗨,我的问题是我有 2 个 .w64 文件(扩展 wav 格式),每个文件都有 16 个单声道音频。我希望能够从每个 .w64 文件中提取特定的音频 channel ,并将这些 channel 作为单独的单 channel 单声道音频流插入到 .mxf 文件中,并且还能够在这些音频流上设置标签信息。我曾尝试使用 -map 等,但它似乎从 .w64 文件中获取所有 channel 并插入 16 个 channel 的单个音频流。我提前道歉,因为我对 ffmpeg 很陌生,并提前感谢你们提供的任何建议。这都是特定于 Windows 上的命令行使用的。
一切顺利
ffmpeg -i "D:\Media\AUDIO_0.W64" -i "D:\media\NO_AUDIO.mxf" -c copy -map 0:0:0 -map 0:0:1 -map 0:0:2 -acodec pcm_s24le -map 1:0 "D:\media\out.mxf"
ffmpeg version N-67838-g4388e78 Copyright (c) 2000-2014 the FFmpeg developers
built on Nov 19 2014 22:02:08 with gcc 4.9.2 (GCC)
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --
enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-lib
modplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrw
b --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinge
r --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --en
able-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis
--enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-
libx265 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 54. 14.100 / 54. 14.100
libavcodec 56. 12.101 / 56. 12.101
libavformat 56. 14.100 / 56. 14.100
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 2.103 / 5. 2.103
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
[w64 @ 0481c580] Estimating duration from bitrate, this may be inaccurate
Input #0, w64, from 'D:\Media\AUDIO_0.W64':
Duration: 00:01:02.56, bitrate: 18432 kb/s
Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, 16 channels
, s32 (24 bit), 18432 kb/s
[mxf @ 048890e0] index entry 1564 + TemporalOffset 1 = 1565, which is out of bou
nds
Input #1, mxf, from 'D:\media\NO_AUDIO.mxf':
Metadata:
uid : adab4424-2f25-4dc7-92ff-29bd000c0000
generation_uid : adab4424-2f25-4dc7-92ff-29bd000c0001
company_name : FFmpeg
product_name : OP1a Muxer
product_version : 57.56.100
product_uid : adab4424-2f25-4dc7-92ff-29bd000c0002
modification_date: 0000-01-01 00:00:00
timecode : 00:00:00:00
Duration: 00:01:02.60, start: 0.000000, bitrate: 2404 kb/s
Stream #1:0: Video: mpeg2video (4:2:2), yuv422p(tv), 1920x1080 [SAR 1:1 DAR16:9], max. 50000 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
File 'D:\media\out.mxf' already exists. Overwrite ? [y/N] y
[mxf @ 04891c60] there must be exactly one video stream and it must be the first
one
Output #0, mxf, to 'D:\media\out.mxf':
Metadata:
encoder : Lavf56.14.100
Stream #0:0: Audio: pcm_s24le, 48000 Hz, 16 channels, s32 (24 bit), 18432 kb/s
Metadata:
encoder : Lavc56.12.101 pcm_s24le
Stream #0:1: Audio: pcm_s24le, 48000 Hz, 16 channels, s32 (24 bit), 18432 kb/s
Metadata:
encoder : Lavc56.12.101 pcm_s24le
Stream #0:2: Audio: pcm_s24le, 48000 Hz, 16 channels, s32 (24 bit), 18432 kb/s
Metadata:
encoder : Lavc56.12.101 pcm_s24le
Stream #0:3: Video: mpeg2video, yuv422p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, max. 50000 kb/s, 25 fps, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s24le (native) -> pcm_s24le (native))
Stream #0:0 -> #0:1 (pcm_s24le (native) -> pcm_s24le (native))
Stream #0:0 -> #0:2 (pcm_s24le (native) -> pcm_s24le (native))
Stream #1:0 -> #0:3 (copy)
Could not write header for output file #0 (incorrect codec parameters ?): Error
number -1 occurred
最佳答案
你的映射搞砸了
错误消息指出,“必须只有一个视频流,并且必须是第一个”。 MXF 很挑剔,因此您必须确保首先映射视频,因为映射顺序将决定输出中的流顺序。
其次,您尝试使用 -map
用于音频 channel 选择,但它不是这样工作的:您必须添加 -map_channel
或平移音频过滤器。
-map_channel
ffmpeg -i "D:\Media\AUDIO_0.W64" -i "D:\media\NO_AUDIO.mxf" \
-map 1:v -map 0:a -map 0:a -map 0:a \
-map_channel 0.0.0:0.1 \
-map_channel 0.0.1:0.2 \
-map_channel 0.0.2:0.3 \
-c:v copy -c:a pcm_s24le \
-shortest "D:\media\out.mxf"
盘式过滤器
或者您可以使用 pan audio filter而不是
-map_channel
:ffmpeg -i "D:\Media\AUDIO_0.W64" -i "D:\media\NO_AUDIO.mxf" \
-filter_complex "[0:a]pan=mono|c0=c0[a0];[0:a]pan=mono|c0=c1[a1];[0:a]pan=mono|c0=c2[a2]" \
-map 1:v -map "[a0]" -map "[a1]" -map "[a2]" \
-c:v copy -c:a pcm_s24le
-shortest "D:\media\out.mxf"
我更喜欢用平底锅。一旦你掌握了锅的窍门,就会有更大的灵 active ,
-map_channel
反正只是用平底锅。元数据
您没有指定要添加到每个流中的元数据,因此我将仅举一个通用示例。要向第三个音频流添加一个名为 key 且值为 value 的元数据字段:
-metadata:s:a:2 key=value
我不确定 MXF 支持什么,或者 MXF 多路复用器支持什么,所以您可能需要进行试验。
关于FFMpeg 如何从 wav/.w64 中提取单个音频 channel 并插入带有轨道标签的 .mxf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229045/