FFMPEG 无法丢弃媒体中的无效数据流。为啥它会留下来以及如何丢弃它?

Posted

技术标签:

【中文标题】FFMPEG 无法丢弃媒体中的无效数据流。为啥它会留下来以及如何丢弃它?【英文标题】:Invalid data stream in media could not be discarded by FFMPEG. Why is it staying and how to discard it?FFMPEG 无法丢弃媒体中的无效数据流。为什么它会留下来以及如何丢弃它? 【发布时间】:2020-12-05 03:49:14 【问题描述】:

我已经下载了一个 [short media][1] 我打算转换然后我将使用结果作为基础来练习和测试我以后学习或使用的任何和所有 FFMPEG 命令。

该视频似乎有一个未知的无效流,无论我试图丢弃它的一切,它都不会消失。当我稍后尝试使用它时,我遇到了各种问题,例如缺少编解码器或没有流,这不是这里的重点,而是我顽固地删除我无法处理的事情的原因。

以下探测在最后一行打印黄色警告。

 > ffprobe -hide_banner -show_streams Movie_Countdown-youtube_I1vMKZ1kvg0.mov

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Movie_Countdown-youtube_I1vMKZ1kvg0.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    creation_time   : 2015-05-20T13:45:55.000000Z
  Duration: 00:00:10.00, start: 0.000000, bitrate: 11474 kb/s
    Stream #0:0(eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 9930 kb/s, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2015-05-20T13:45:55.000000Z
      handler_name    : Apple Video Media Handler
      encoder         : H.264
      timecode        : 00:00:00:00
    Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2015-05-20T13:45:56.000000Z
      handler_name    : Apple Sound Media Handler
      timecode        : 00:00:00:00
    Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
    Metadata:
      creation_time   : 2015-05-20T13:46:11.000000Z
      handler_name    : Time Code Media Handler
      timecode        : 00:00:00:00
Unsupported codec with id 0 for input stream 2

在流输出下方。我拆分了文本,因此您无需在中间搜索即可看到警告。

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_time_base=1/50
codec_tag_string=avc1
codec_tag=0x31637661
width=1920
height=1080
coded_width=1920
coded_height=1088
closed_captions=0
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=40
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=unknown
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/25
start_pts=0
start_time=0.000000
duration_ts=250
duration=10.000000
bit_rate=9930739
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=250
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:creation_time=2015-05-20T13:45:55.000000Z
TAG:language=eng
TAG:handler_name=Apple Video Media Handler
TAG:encoder=H.264
TAG:timecode=00:00:00:00
[/STREAM]
[STREAM]
index=1
codec_name=pcm_s16le
codec_long_name=PCM signed 16-bit little-endian
profile=unknown
codec_type=audio
codec_time_base=1/48000
codec_tag_string=sowt
codec_tag=0x74776f73
sample_fmt=s16
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=16
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/48000
start_pts=0
start_time=0.000000
duration_ts=480000
duration=10.000000
bit_rate=1536000
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=480000
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:creation_time=2015-05-20T13:45:56.000000Z
TAG:language=eng
TAG:handler_name=Apple Sound Media Handler
TAG:timecode=00:00:00:00
[/STREAM]
[STREAM]
index=2
codec_name=unknown
codec_long_name=unknown
profile=unknown
codec_type=data
codec_tag_string=tmcd
codec_tag=0x64636d74
id=N/A
r_frame_rate=0/0
avg_frame_rate=25/1
time_base=1/25
start_pts=0
start_time=0.000000
duration_ts=250
duration=10.000000
bit_rate=3
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=1
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:creation_time=2015-05-20T13:46:11.000000Z
TAG:language=eng
TAG:handler_name=Time Code Media Handler
TAG:timecode=00:00:00:00
[/STREAM]

我将其缩小并重新编码以供初学者使用,我尝试使用-dn 丢弃数据流,但我将在最后提到的其他方法失败。 到目前为止的输出表明丢弃应该是可行的,因为替代数据是 0kB 并且没有列出流 2。

 > ffmpeg -hide_banner -dn -i C:\Users\admin-dix\Downloads\Movie_Countdown-youtube_I1vMKZ1kvg0.mov -vf "scale=h=450:w=800" -f mp4 -c:a aac -c:v libx264 mov_countdown.mp4

Output #0, mp4, to 'mov_countdown.mp4':
  Metadata:
    major_brand     : qt
    minor_version   : 537199360
    compatible_brands: qt
    encoder         : Lavf58.45.100
    Stream #0:0(eng): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p(progressive), 800x450 [SAR 1:1 DAR 16:9], q=-1--1, 0.04 fps, 12800 tbn, 25 tbc (default)
    Metadata:
      creation_time   : 2015-05-20T13:45:55.000000Z
      handler_name    : Apple Video Media Handler
      timecode        : 00:00:00:00
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2015-05-20T13:45:56.000000Z
      handler_name    : Apple Sound Media Handler
      timecode        : 00:00:00:00
      encoder         : Lavc58.91.100 aac
frame=  250 fps= 43 q=-1.0 Lsize=     342kB time=00:00:10.00 bitrate= 280.1kbits/s speed= 1.7x
video:175kB audio:159kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.710857%

然后ffprobe不同意,还有流和警告。

ffprobe mov_countdown.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mov_countdown.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.45.100
  Duration: 00:00:10.02, start: 0.000000, bitrate: 279 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 800x450 [SAR 1:1 DAR 16:9], 142 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : Apple Video Media Handler
      timecode        : 00:00:00:00
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 129 kb/s (default)
    Metadata:
      handler_name    : Apple Sound Media Handler
    Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s
    Metadata:
      handler_name    : Apple Video Media Handler
      timecode        : 00:00:00:00
Unsupported codec with id 0 for input stream 2

我根据this answer-map 0:d 尝试了负映射,但失败了。我不理解 -discard 选项,因为 ffmpeg 文档引用了 -vn,-an,-dn 条目,因为它没有指定流。

为什么要这样做,我怎样才能删除我不知道并且不想在以后的测试中关心的流?

[1]:清洁复古电影倒计时 - 来自 Philippe Moesch 的 YouTube https://www.youtube.com/watch?v=I1vMKZ1kvg0

【问题讨论】:

【参考方案1】:

数据流是时间码流。当 ffmpeg 读取带有此类流的 MOV/MP4 文件时,它会将时间码存储为元数据。如果输出复用器是 MOV/MP4,它将读取该元数据并将该时间码存储为数据轨道。添加 -write_tmcd false 以禁用此行为。

【讨论】:

根据文档,定义此选项的 mov/mp4 多路复用器将值命名为 off,on,auto 而不是布尔值 false/true 或类似 0 的数字/1/-1。无论如何,感谢这个答案,我能够通过关键字找到以下准确反映问题和解决方案的错误条目。 trac.ffmpeg.org/ticket/5492> 该选项是一个布尔值,ffmpeg 接受true, y, yes, enable, enabled, on, 1false, n, no, disable, disabled, off, 0 用于此类选项。一些人还接受auto, -1

以上是关于FFMPEG 无法丢弃媒体中的无效数据流。为啥它会留下来以及如何丢弃它?的主要内容,如果未能解决你的问题,请参考以下文章

hls流媒体视频防盗实现

使用ffmpeg libavcodec将视频流编码为H264,为啥持续时间为零

ffmpeg/libx264 C API:从短 MP4 末尾丢弃的帧

FFMPEG- 流媒体在几秒钟后停止

FFmpeg 命令行工具ffmpeg

FFmpeg调研报告