質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

4472閲覧

FFmpegで音声ファイル変換時の標準出力から出力ファイルの再生時間を取得したい

masayasasaki96

総合スコア19

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2018/09/25 18:05

###標準出力の文字列の中から特定の情報を抽出したいです

現在、Linux(Raspberry Pi)でffmpegを利用して音声ファイル変換をしています。そのときコマンドラインに、自動的にファイルの変換情報が出力されるのですが、この中から変換後のファイルの再生時間である「time=〇〇」の〇〇の部分だけを抜き出したいです。(出力の下から2行目です)

発生している問題

ffmpegのコマンドをパイプでsed, awk, grepコマンドなどと繋げば取得可能かと思い試してみたのですが、強制的に全ての情報が出力されてしまいます。

問題の出力

ffmpeg

1一部抜粋 2Input #0, s16be, from 'spch.raw': 3 Duration: 00:00:02.99, bitrate: 255 kb/s 4 Stream #0:0: Audio: pcm_s16be, 16000 Hz, mono, s16, 256 kb/s 5Output #0, wav, to 'speech2.wav': 6 Metadata: 7 ISFT : Lavf57.56.101 8 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s 9 Metadata: 10 encoder : Lavc57.64.101 pcm_s16le 11Stream mapping: 12 Stream #0:0 -> #0:0 (pcm_s16be (native) -> pcm_s16le (native)) 13Press [q] to stop, [?] for help 14size= 93kB time=00:00:02.98 bitrate= 256.2kbits/s speed= 343x 15video:0kB audio:93kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.081537%

試したこと

ffmpeg -y -f s16be -ar 16000 -ac 1 -i spch.raw -ar 16000 -ac 1 -acodec pcm_s16le speech.wav | [ここに次のようなコマンドを入力しました]

コマンド:

sed -n 2p (この行数は適当) rep “time” tail -2

また、subprocess.run()などを使った簡易的なプログラムも作ってみましたが、うまく動かすことができませんでした。

なお、ffprobeを利用して既存のwaveファイルからの情報取得はできました。

ffprobe -i speech.wav -loglevel quiet -show_entries format=duration | sed -n 2p | sed -e "s/duration=//"

これと同様のことをffmpegで実装したいです。変換した後に情報を取得すると時間がかかる上、二度手間になってしまうと考えたため、変換時にまとめて行えるようしたいです。

解決策を教えていただけると助かります。どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

masayasasaki96さん、

ffmpegで取得しようとしている出力は、標準エラー出力なので、一度、標準出力にリダイレクト(2>&1)してから、パイプして、コマンドに渡します。

$ # 例: $ ffmpeg -y -f s16be -ar 16000 -ac 1 -i test.raw -ar 16000 -ac 1 -acodec pcm_s16le speech.wav 2>&1 | grep "time" size= 106kB time=00:00:03.40 bitrate= 256.2kbits/s speed= 359x $

投稿2018/09/25 19:56

mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masayasasaki96

2018/09/26 01:15

mt08さん、早速のご回答をありがとうございました。 標準エラー出力というものだったんですね。とても勉強になりました。 お陰さまで無事解決いたしました。またよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問