【问题标题】:FFMPEG doesn't work with mp4 and stdoutFFMPEG 不适用于 mp4 和 stdout
【发布时间】:2022-02-25 17:52:06
【问题描述】:

我需要在 mp4 视频中添加文本。如果我将结果写入文件,那么一切正常,但我想从 ffmpeg 流中读取数据。

我运行命令:

ffmpeg -i sample.mp4 -filter_complex "drawtext='text=\"Sample Text\"':x=(w-text_w)/2:y=(h-text_h-line_h)/2:fontsize=40:fontcolor=white:fontfile=TimesNewRoman.ttf:enable='between(t,1,5)'"  -f mp4 -

我收到以下错误:

ffmpeg version 2.2.2-tessus Copyright (c) 2000-2014 the FFmpeg developers
  built on May  7 2014 23:17:42 with clang version 3.3 (tags/RELEASE_33/final)
  configuration: --cc=/opt/local/bin/clang-mp-3.3 --prefix=/Users/tessus/data/ext/ffmpeg/sw --as=yasm --extra-version=tessus --disable-shared --enable-static --disable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libx265 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxavs --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-libmodplug --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --disable-indev=qtkit --enable-runtime-cpudetect
  libavutil      52. 66.100 / 52. 66.100
  libavcodec     55. 52.102 / 55. 52.102
  libavformat    55. 33.100 / 55. 33.100
  libavdevice    55. 10.100 / 55. 10.100
  libavfilter     4.  2.100 /  4.  2.100
  libswscale      2.  5.102 /  2.  5.102
  libswresample   0. 18.100 /  0. 18.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'a5732-480x320-clip01-sound.mp4':
  Metadata:
    major_brand     : M4V 
    minor_version   : 1
    compatible_brands: M4V mp42isom
creation_time   : 2014-02-12 02:23:02
  Duration: 00:00:15.10, start: 0.000000, bitrate: 509 kb/s
Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p(tv), 480x320 [SAR 1:1 DAR 3:2], 457 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
  creation_time   : 2014-02-12 02:23:02
  handler_name    : Mainconcept MP4 Video Media Handler
Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 32000 Hz, stereo, fltp, 46 kb/s (default)
Metadata:
  creation_time   : 2014-02-12 02:23:02
  handler_name    : Mainconcept MP4 Sound Media Handler
[libx264 @ 0x10400d800] using SAR=1/1
[libx264 @ 0x10400d800] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
[libx264 @ 0x10400d800] profile High, level 2.1
[libx264 @ 0x10400d800] 264 - core 142 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
[mp4 @ 0x10400d200] muxer does not support non seekable output
Output #0, mp4, to 'pipe:':
  Metadata:
major_brand     : M4V 
minor_version   : 1
compatible_brands: M4V mp42isom
encoder         : Lavf55.33.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 480x320 [SAR 1:1 DAR 3:2], q=-1--1, 90k tbn, 29.97 tbc (default)
Stream #0:1(eng): Audio: aac (libvo_aacenc) ([64][0][0][0] / 0x0040), 32000 Hz, stereo, s16, 128 kb/s (default)
Metadata:
  creation_time   : 2014-02-12 02:23:02
  handler_name    : Mainconcept MP4 Sound Media Handler
Stream mapping:
  Stream #0:0 (h264) -> drawtext (graph 0)
  drawtext (graph 0) -> Stream #0:0 (libx264)
  Stream #0:1 -> #0:1 (aac -> libvo_aacenc)
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Conversion failed!

似乎问题与 mp4 和“muxer 不支持不可搜索的输出”有关

有没有一种解决方案,如何在我们有数据的情况下即时添加此类文本并返回视频,而不是等到所有文件都处理完毕。

谢谢

【问题讨论】:

  • Java 与您的问题有什么关系?
  • 您可以添加-v debug 以提高ffmpeg 日志级别。
  • 我从 java 运行它并尝试从 ffmpeg 读取输入流

标签: ffmpeg


【解决方案1】:

您不能将 MP4 与 STDOUT 一起使用。 MP4 容器要求编码器在完成写入文件后返回并更改文件的开头。由于 STDOUT 无法查找,因此无法使用 STDOUT 在 MP4 容器中输出媒体。

【讨论】:

  • 如果仍然想将 STDOUT 与 FFMPEG 一起使用,什么是合适的格式?
  • @JesperHustad 我祝 Matroska 好运。
【解决方案2】:

您可以使用empty_moov 示例ffmpeg -y -framerate 0.5 -pattern_type glob -i '*.jpg' -f mp4 -movflags empty_moov - | ffprobe -

-movflags empty_moov

直接在文件开头写一个初始 moov atom,而不在其中描述任何样本。通常,在文件开头写入 mdat/moov 对,作为普通的 MOV/MP4 文件,仅包含文件的一小部分。设置此选项后,没有初始 mdat 原子,moov 原子仅描述轨道,但持续时间为零。

在写入 ismv (Smooth Streaming) 文件时会隐式设置此选项。 https://www.ffmpeg.org/ffmpeg-formats.html

【讨论】:

    【解决方案3】:

    添加参数

    -movflags frag_keyframe+empty_moov
    

    来自:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/issues/346#issuecomment-67299526

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 2012-11-29
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多