FFMpeg 如何从 wav/.w64 中提取单个音频 channel 并插入带有轨道标签的 .mxf

标签 ffmpeg wav

嗨,我的问题是我有 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/

相关文章:

iphone - 在IOS6.1中构建FFMpeg错误无法创建可执行文件

ffmpeg - crtmpserver 错误,appselector 可以是最终目的地

c# - 分析wav并绘制图形

c++ - 8 位(每个样本的位数)PCM WAV 文件是否可以包含多个 channel ?

c++ - 计算 wav 文件的持续时间

c - 在C中加载内存中的wav音频文件

linux - Ubuntu FFMPEG 动态图像文件名

ffmpeg - mpeg-dash 工具包,我怎样才能制作这样的视频?

c# - 如何在 C# WPF 项目中使用 SharpDX DirectSound 播放 .wav 文件?

android - 可以在android中实时捕获视频并将其流式传输到闪存服务器吗?