メディアファイルに関する多くの情報を取得するには
ffmpeg -i <filename>
多くの行、特に1行を出力する場所
Duration: 00:08:07.98, start: 0.000000, bitrate: 2080 kb/s
00:08:07.98
のみを出力したいので、
ffmpeg -i file.mp4 | grep Duration| sed 's/Duration: \(.*\), start/\1/g'
ただし、長さだけでなく、すべてが印刷されます。
ffmpeg -i file.mp4 | grep Duration
でもすべてを出力します。
デュレーションの長さだけを取得するにはどうすればよいですか?
ffmpegは、その情報をstderr
ではなくstdout
に書き込みます。これを試して:
ffmpeg -i file.mp4 2>&1 | grep Duration | sed 's/Duration: \(.*\), start/\1/g'
stderr
からstdout
へのリダイレクトに注意してください:2>&1
編集:
sed
ステートメントも機能していません。これを試して:
ffmpeg -i file.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
ffprobe
を使用できます:
ffprobe -i <file> -show_entries format=duration -v quiet -of csv="p=0"
次のような期間を秒単位で出力します。
154.12
-sexagesimal
オプションを追加すると、期間がhours:minutes:seconds.microsecondsとして出力されます。
00:02:34.12
私の経験から、多くのツールは、ある種のテーブル/順序付けられた構造で目的のデータを提供し、そのデータの特定の部分を収集するパラメーターも提供します。これは、例えばsmartctl、nvidia-smiおよびffmpeg/ffprobeも。簡単に言えば-多くの場合、そのようなタスクのためにデータをパイプしたり、サブシェルを開いたりする必要はありません。
結果として、私は仕事に適切なツールを使用します-その場合、ffprobeは生の継続時間値を秒単位で返します。その後、自分で希望の時間形式を作成できます。
$ ffmpeg --version
ffmpeg version 2.2.3 ...
コマンドは、使用しているバージョンによって異なる場合があります。
#!/usr/bin/env bash
input_file="/path/to/media/file"
# Get raw duration value
ffprobe -v quiet -print_format compact=print_section=0:nokey=1:escape=csv -show_entries format=duration "$input_file"
説明:
「-v quiet」:目的の生データ値以外は何も出力しません
「-print_format」:特定の形式を使用してデータを印刷する
"compact =":コンパクトな出力形式を使用する
"print_section = 0":セクション名を印刷しません
":nokey = 1":key:valueペアのキーを出力しません
":escape = csv":値をエスケープします
「-show_entries format = duration」:formatという名前のセクション内でdurationという名前のフィールドのエントリを取得します
参照: ffprobe manページ
1つのリクエストパラメータの場合、mediainfoとそのような出力フォーマットを使用する方が簡単です(期間:ミリ秒単位で回答)
amber ~ > mediainfo --Output="General;%Duration%" ~/work/files/testfiles/+h263_aac.avi
24840
ffmpeg -i abc.mp4 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
出力を与える
HH:MM:SS.milisecs
JSON形式を使用することをお勧めします。解析が簡単です
ffprobe -i your-input-file.mp4 -v quiet -print_format json -show_format -show_streams -hide_banner
{
"streams": [
{
"index": 0,
"codec_name": "aac",
"codec_long_name": "AAC (Advanced Audio Coding)",
"profile": "HE-AACv2",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "fltp",
"sample_rate": "44100",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/28224000",
"duration_ts": 305349201,
"duration": "10.818778",
"bit_rate": "27734",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0
}
}
],
"format": {
"filename": "your-input-file.mp4",
"nb_streams": 1,
"nb_programs": 0,
"format_name": "aac",
"format_long_name": "raw ADTS AAC (Advanced Audio Coding)",
"duration": "10.818778",
"size": "37506",
"bit_rate": "27734",
"probe_score": 51
}
}
フォーマットセクションで期間情報を見つけることができ、ビデオとオーディオの両方で機能します
最善の解決策:エクスポートをカットして、00:05:03.22のようなものを取得します
ffmpeg -i input 2>&1 | grep Duration | cut -c 13-23
Ffmpegでメディアファイルから長さ(および場合によっては他のすべてのメタデータ)を取得する場合は、python scriptを使用して、これを試すことができます。
import subprocess
import json
input_file = "< path to your input file here >"
metadata = subprocess.check_output(f"ffprobe -i {input_file} -v quiet -print_format json -show_format -hide_banner".split(" "))
metadata = json.loads(metadata)
print(f"Length of file is: {float(length["format"]["duration"])}")
print(metadata)
出力:
Length of file is: 7579.977143
{
"streams": [
{
"index": 0,
"codec_name": "mp3",
"codec_long_name": "MP3 (MPEG audio layer 3)",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "[0][0][0][0]",
"codec_tag": "0x0000",
"sample_fmt": "fltp",
"sample_rate": "44100",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/14112000",
"start_pts": 353600,
"start_time": "0.025057",
"duration_ts": 106968637440,
"duration": "7579.977143",
"bit_rate": "320000",
...
...
Windowsで追加のソフトウェアを使用せずに同じ計算を実行する場合のコマンドラインスクリプトのスクリプトは次のとおりです。
set input=video.ts
ffmpeg -i "%input%" 2> output.tmp
rem search " Duration: HH:MM:SS.mm, start: NNNN.NNNN, bitrate: xxxx kb/s"
for /F "tokens=1,2,3,4,5,6 delims=:., " %%i in (output.tmp) do (
if "%%i"=="Duration" call :calcLength %%j %%k %%l %%m
)
goto :EOF
:calcLength
set /A s=%3
set /A s=s+%2*60
set /A s=s+%1*60*60
set /A VIDEO_LENGTH_S = s
set /A VIDEO_LENGTH_MS = s*1000 + %4
echo Video duration %1:%2:%3.%4 = %VIDEO_LENGTH_MS%ms = %VIDEO_LENGTH_S%s
ここに投稿された同じ回答: TSビデオから最後のN秒を切り取る方法