【问题标题】:Bash: displaying selected output, do not print unnecessary outputBash:显示选定的输出,不打印不必要的输出
【发布时间】:2014-07-02 07:18:48
【问题描述】:

我不知道这是否可能: 我正在使用 ffmpeg,我想减少命令的输出。我有这个结果:

ffmpeg version 2.2.git Copyright (c) 2000-2014 the FFmpeg developers
  built on Jun 17 2014 11:08:12 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-libvidstab --enable-libx265
  libavutil      52. 89.100 / 52. 89.100
  libavcodec     55. 67.100 / 55. 67.100
  libavformat    55. 43.100 / 55. 43.100
  libavdevice    55. 13.101 / 55. 13.101
  libavfilter     4.  8.100 /  4.  8.100
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, hls,applehttp, from 'http://ftvodhdsecz-f.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2014/S26/J7/104904507-20140629-,398,632,934,k.mp4.csmil/index_2_av.m3u8?null=':
  Duration: 00:51:05.07, start: 0.100667, bitrate: 0 kb/s
  Program 0 
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 704x396 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 67 kb/s
    Stream #0:2: Data: timed_id3 (ID3  / 0x20334449)
File '/media/path/video.mkv' already exists. Overwrite ? [y/N] y
[matroska @ 0x2958840] Error parsing AAC extradata, unable to determine samplerate.
Output #0, matroska, to '/media/path/video.mkv':
  Metadata:
    encoder         : Lavf55.43.100
    Stream #0:0: Video: h264 (H264 / 0x34363248), yuv420p, 704x396 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 1k tbn, 90k tbc
    Stream #0:1: Audio: aac ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, 67 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[hls,applehttp @ 0x2864c20] Failed to open segment of playlist 0ate= 844.6kbits/s    
frame= 3000 fps=174 q=-1.0 Lsize=   12325kB time=00:02:00.00 bitrate= 841.4kbits/s 

我只想知道这4个信息:

1) Duration: 00:51:05.07, start: 0.100667, bitrate: 0 kb/s
2)  File '/media/path/video.mkv' already exists. Overwrite ? [y/N] y
3)  Output #0, matroska, to '/media/path/video.mkv':
4)  frame= 3000 fps=174 q=-1.0 Lsize=   12325kB time=00:02:00.00 bitrate= 841.4kbits/s 

我试过-v option,但输出要么是-v info(这个长输出),要么是-v warning,要么是-v error。没有我想要的。 我见过这个question,但输出是完全清楚的。我可以为特殊字符串设置一个例外吗? 谢谢大家

编辑:我的脚本中的行是这样的:

ffmpeg -i "${M3U2}" -vcodec copy -acodec copy "${Directory}/${PROG}_${ID}.mkv"

【问题讨论】:

    标签: bash ffmpeg output


    【解决方案1】:

    您可以将 stderr 重定向到 stdout 并使用 grep 过滤行,例如

    ffmpeg -i "${M3U2}" -vcodec copy -acodec copy "${Directory}/${PROG}_${ID}.mkv" 2>&1 | grep -E -e '[[:blank:]]+Duration' -e '[[:blank:]]+File' -e '[[:blank:]]+Output' -e '[[:blank:]]+frame'
    

    或者

    ffmpeg -i "${M3U2}" -vcodec copy -acodec copy "${Directory}/${PROG}_${ID}.mkv" 2>&1 | egrep -e '^[[:blank:]]*(Duration|File|Output|frame)'
    

    您只需要确保您的命令不会要求输入。

    【讨论】:

    • 或 awk awk '/^ Duration/ || /^File/ || /^Output/ || /^frame/'
    • @konsolebox:感谢您的回答,我只有这一行和您的 2 行:Duration: 00:12:28.52, start: 0.100667, bitrate: 0 kb/s
    • @Guillaume 就像我说的那样,您应该确保 ffmpeg 不会要求输入。它可能要求确认是否覆盖文件。
    • @konsolebox:好的,我知道它是如何工作的。我添加了-y 选项以确保。非常感谢。但是,最后一行是动态的,根本不显示。
    • 我为动态输出发布了new question。再次感谢
    【解决方案2】:

    我用

    while read -d $'\n' -r line; do
    
      # dynamically filter line
      case line in:
       *what i want*)
       echo "hihih$line"
       ;;
      esac
    
    done < <(program i want to run)
    

    动态过滤输出

    【讨论】:

    • 谢谢,请问您的代码是否准确?我是 bash 的初学者! konsolebox 的代码有效,但不是动态的。使用您的代码,我有这个错误:Erreur de syntaxe près du symbole inattendu « in: »(法语)
    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多