Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Audio 为什么可以';我不能用ffmpeg对mpg容器中的流重新排序吗?_Audio_Video_Ffmpeg - Fatal编程技术网

Audio 为什么可以';我不能用ffmpeg对mpg容器中的流重新排序吗?

Audio 为什么可以';我不能用ffmpeg对mpg容器中的流重新排序吗?,audio,video,ffmpeg,Audio,Video,Ffmpeg,背景: 我有一个mpg文件,其中音频作为流0,视频作为流1。 它在OSX QT Player下可以正常播放,但在Win10的默认应用程序下不能播放。 由于没有更好的想法,我假设不寻常的流顺序是我的问题,我正试图用ffmpeg解决它。 真幸运!完全描述了我的情况 重新排序流 映射选项的顺序决定了流在输出中的顺序。在本例中,输入文件将音频作为流#0,视频作为流#1(这是可能的,但不常见)。重新定位视频以使其首先列出,然后是音频的示例: ffmpeg-i input.mp4-map 0:v-map 0

背景:
我有一个mpg文件,其中音频作为流0,视频作为流1。
它在OSX QT Player下可以正常播放,但在Win10的默认应用程序下不能播放。
由于没有更好的想法,我假设不寻常的流顺序是我的问题,我正试图用ffmpeg解决它。 真幸运!完全描述了我的情况

重新排序流

映射选项的顺序决定了流在输出中的顺序。在本例中,输入文件将音频作为流#0,视频作为流#1(这是可能的,但不常见)。重新定位视频以使其首先列出,然后是音频的示例:

ffmpeg-i input.mp4-map 0:v-map 0:a-c copy output.mp4

此示例使用-c copy复制流(重新多路复用),以避免重新编码

我使用的正是这个命令,但翻转似乎不起作用,就像这样:

ffprobe -hide_banner myfile.trimmed.mpg
[h264 @ 000001b965b569c0] Increasing reorder buffer to 2
Input #0, mpeg, from 'myfile.trimmed.mpg':
  Duration: 00:02:41.09, start: 0.500000, bitrate: 6255 kb/s
    Stream #0:0[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:1[0x1e2]: Video: h264 (High), yuv420p(tv, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc
什么,什么?! 命令输出看起来与我要求的完全一样,但结果文件的流顺序与原始文件相同。我缺少什么?

一个可能的线索是:看起来音频流比视频流先开始。我在音频流中看到的最小pkt_pts_时间是00:00.500000,而在视频流中看到的最小pkt_pts_时间是0:00:01.912967这有关系吗?

一开始这似乎很棘手。我想知道你是否会握着钥匙:

mpeg-ps中没有流顺序。 您从ffmpeg输出顺序中看到的可能只是音频或视频数据包最先出现的情况

但这并不是真正的问题;但是,值得注意的是,当您尝试输出MP4或MKV时,您的文件具有.mpg扩展名。H.264或AAC基本流无效

如果您自己没有创建此文件,那么它可能是一个标签错误的容器(例如MKV或MP4),或者有人奇怪地将流混合到.mpg。请注意FFmpeg如何在流重新排序尝试期间警告您不兼容的编解码器

MPEG-PS是一种打包格式,因此没有基本流。如果它是真正的MPEG-PS文件,那么可能是音频样本首先出现。无论哪种方式,您都应该放弃使用.mpg作为格式

有关如何使用FFprobe相当准确地识别实际容器格式的信息,请参见本答案的结尾。

我又想了一想,最后一个神经元提醒我,
-map
输出是如何按照赋值顺序进行的

需要注意的一件重要事情是,
-map 0:v-map 0:a
对于包含多个流类型的文件来说,并不像您所期望的那样有效,因为该语法匹配该类型的所有适用流


Gyan已澄清,如果您的文件正好包含一个视频和一个音频流,
-map 0:v-map 0:a
将与
-map 0:1-map 0:0
等效

如果要使用
0:a
语法,例如,如果您有多个音频,则必须单独寻址,否则FFmpeg将在重新排序时对它们进行分组<代码>-映射0:a将移动两个音频<代码>-映射0:a:0将仅移动第一个音频

另一种方法是,记住始终检查您操作的每个文件中的流顺序,即按照您希望在输出中使用的顺序指定绝对流编号。因此,如果您的视频是源文件中两个流中的第二个,那么,
-map 0:1-map 0:0

对于包含一个视频和一个音频流的文件,您可以使用任何一种方法


测验 我创建了一个.MP4文件,其中包含一个H.264视频流0:0和一个MP3音频流0:1

原始文件:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\video-audio.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.78.100
  Duration: 00:05:00.30, start: 0.000000, bitrate: 422 kb/s
  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 421 kb/s, 23.98 fps, 23.98 tbr, 11988 tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : GPAC ISO Video Handler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 180 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
然后我把它反馈给FFmpeg:

ffmpeg-ic:\temp\video-audio.mp4-map 0:1-map 0:0-C copy C:\temp\swapped.mp4

(在本例中相当于
-map 0:a-map 0:v

结果:交换流;MP3音频流为0:0,H.264视频流为0:1

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\swapped.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.78.100
  Duration: 00:05:00.30, start: 0.000000, bitrate: 422 kb/s
  Stream #0:0(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 180 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 421 kb/s, 23.98 fps, 23.98 tbr, 11988 tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : GPAC ISO Video Handler
      vendor_id       : [0][0][0][0]
这似乎实现了您的目标:-)

ffmpeg-i INPUTFILE-map 0:1-map 0:0-c copy OUTPUTFILE.mp4

ffmpeg-i INPUTFILE-map 0:v-map 0:a-c copy OUTPUTFILE.mp4

提醒:

  • 对于包含一个视频和一个音频流的文件,可以使用上述任一方法
  • 对于包含多个音频或视频的文件,请确定流索引,并使用更精细的
    0:v:0
    0:a:0
    语法进行指定
ffmpeg-i INPUTFILE
显示文件的数字流ID,这对于奇数文件可能更快。但是,数字引用在重新排序时跳过仅指定音频、视频、字幕等的健全性检查

文档也值得收藏

进一步阅读:

  • ,它又引用了关于
    -disposition
    开关的内容。NB:<代码> -处置<代码>用于指示玩家应该将哪些流视为缺省值(),不做任何物理流重排。
(非常感谢吉安如此敏锐的观察力!)


使用FFprobe识别容器 FFprobe可以尽最大努力检测真实的容器格式,忽略扩展。下面是我的演示“swapped.mp4”的一个示例,重命名为.mpg:

ffprobe -hide_banner -show_error -show_format -i "C:\temp\swapped.mpg"
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\swapped.mpg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.78.100
  Duration: 00:05:00.30, start: 0.000000, bitrate: 422 kb/s
  Stream #0:0(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 180 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 421 kb/s, 23.98 fps, 23.98 tbr, 11988 tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : GPAC ISO Video Handler
      vendor_id       : [0][0][0][0]
[FORMAT]
filename=C:\temp\swapped.mpg
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=300.301000
size=15847817
bit_rate=422184
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf58.78.100
[/FORMAT]
注意
major\u brand=isom
(),
format\u name
format\u long\u name
等等

我上个月制作的一个真正的MPEG-2视频(DVD rip)输出如下:

ffprobe -hide_banner -show_error -show_format -i "C:\temp\opera.mpg"
Input #0, mpeg, from 'C:\temp\opera.mpg':
  Duration: 02:15:23.71, start: 66240.530111, bitrate: 4194 kb/s
  Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, smpte170m, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Side data:
      cpb: bitrate max/min/avg: 7000000/0/0 buffer size: 1835008 vbv_delay: N/A
  Stream #0:1[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
[FORMAT]
filename=C:\temp\opera.mpg
nb_streams=2
nb_programs=0
format_name=mpeg
format_long_name=MPEG-PS (MPEG-2 Program Stream)
start_time=66240.530111
duration=8123.712000
size=4259503237
bit_rate=4194637
probe_score=26
[/FORMAT]

FFprobe正确地将
format\u name
报告为
mpeg
并将
format\u long\u name
报告为
mpeg-PS
克里斯所说的一切都是正确的,这是一个很大的帮助。里面有H264视频的原始.MPG来自TivoDecoder;我从未想过质疑该容器是否适用于该视频格式,当QT愿意播放它时,我认为ffprobe警告不是一个错误
ffprobe -hide_banner -show_error -show_format -i "C:\temp\swapped.mpg"
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\temp\swapped.mpg':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.78.100
  Duration: 00:05:00.30, start: 0.000000, bitrate: 422 kb/s
  Stream #0:0(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 180 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 421 kb/s, 23.98 fps, 23.98 tbr, 11988 tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : GPAC ISO Video Handler
      vendor_id       : [0][0][0][0]
[FORMAT]
filename=C:\temp\swapped.mpg
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=300.301000
size=15847817
bit_rate=422184
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf58.78.100
[/FORMAT]
ffprobe -hide_banner -show_error -show_format -i "C:\temp\opera.mpg"
Input #0, mpeg, from 'C:\temp\opera.mpg':
  Duration: 02:15:23.71, start: 66240.530111, bitrate: 4194 kb/s
  Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, smpte170m, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Side data:
      cpb: bitrate max/min/avg: 7000000/0/0 buffer size: 1835008 vbv_delay: N/A
  Stream #0:1[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s
[FORMAT]
filename=C:\temp\opera.mpg
nb_streams=2
nb_programs=0
format_name=mpeg
format_long_name=MPEG-PS (MPEG-2 Program Stream)
start_time=66240.530111
duration=8123.712000
size=4259503237
bit_rate=4194637
probe_score=26
[/FORMAT]
ffmpeg -hide_banner -ss 00:17:24 -i myfile.mpg -t 00:02:40 -c copy myfile.trimmed.mp4
[h264 @ 000002d5d73f4040] Increasing reorder buffer to 2
[mpegts @ 000002d5d73edbc0] PES packet size mismatch
[mpegts @ 000002d5d73edbc0] Packet corrupt (stream = 1, dts = 8467425232).
[mpegts @ 000002d5d73edbc0] Could not find codec parameters for stream 2 (Unknown: none ([151][0][0][0] / 0x0097)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[mpegts @ 000002d5d73edbc0] PES packet size mismatch
[mpegts @ 000002d5d73edbc0] Packet corrupt (stream = 1, dts = 8467425232).
Input #0, mpegts, from 'myfile.mpg':
  Duration: 00:30:00.63, start: 92282.982578, bitrate: 6249 kb/s
  Program 1
    Stream #0:0[0x1aab]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc
    Stream #0:1[0x1abf]: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:2[0x1ac1]: Unknown: none ([151][0][0][0] / 0x0097)
[mp4 @ 000002d5d7e90540] track 1: codec frame size is not set
Output #0, mp4, to 'myfile.trimmed.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 59.94 fps, 59.94 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 9570 fps=0.0 q=-1.0 Lsize=  122587kB time=00:02:39.99 bitrate=6276.6kbits/s speed= 462x
video:114772kB audio:7545kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.220873%
ffprobe -hide_banner -show_error -show_format -i myfile.trimmed.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'myfile.trimmed.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:02:40.96, start: 0.000000, bitrate: 6239 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 5890 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Side data:
      audio service type: main
[FORMAT]
filename=myfile.trimmed.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=160.960000
size=125529106
bit_rate=6239021
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf58.45.100
[/FORMAT]