digital/devices/PC/Windows/アプリ
の編集
https://over.6pb.info/wiki/?&4c88579664
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
*ffmpeg [#ffmpeg] TMPGEncを使わずにこれを使うのは自動化が目的だから、スクリプトを使う。私はPerl (Active Perl)を使う。 #pre{{ #!/usr/bin/perl use utf8; # NHKニュース7.ts のエンコード専用 my $serviceID = 1024; my $fname = qr/^(.+NHKニュース7)\.ts$/; # .tsのあるディレクトリで実行。 # GUIから直接実行なら、終了後画面が閉じるのでSTDERRを保存する。 use strict; use warnings; use Encode; my $cp932 = find_encoding('cp932'); # http://gihyo.jp/dev/serial/01/modern-perl/0032?page=2 # 画面に出すならこのbinmode STDERR ...はwell works # binmode STDERR, ":encoding(cp932)"; # ('cp932')はNG # ファイルに出す close STDERR; open (STDERR, '>>:encoding(cp932)', 'ffmpeg.log') or die $!; $| = 1; # current directory use Cwd; my $wd = Cwd::getcwd(); opendir my $dh, $wd or die "$wd:$!"; my @files = readdir $dh; closedir $dh; for (@files) { $_ = $cp932->decode($_); # 正規表現リテラルで検討するにはdecode必須。 next unless /$fname/; # ファイル名をencodeしないと対外的な操作できない。 my $infile = $cp932->encode($_); my $outfile = $cp932->encode($1) . '.mp4'; my $mtime = (stat($infile))[9]; # 動画時間を取得し、何倍速でエンコードできたか表示する my $info = qx(ffprobe "$infile" -hide_banner -show_entries format=duration); # STDOUTにこれだけ返り、$infoに入る。 # [FORMAT] # duration=1808.072933 # [/FORMAT] my $duration = 0; if ($info =~ m|duration=([\d\.]+)|g) { $duration = $1; } my $stime = time; qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$infile" -vf "scale=1280:720" -global_quality 25 -c:v h264_qsv -ac 2 -map 0:p:$serviceID:0 -map 0:p:$serviceID:1 "$outfile" ); # タイムスタンプ変更 utime($mtime, $mtime, $outfile) if -e $outfile; my $passed = time - $stime // 0; my $sname = $cp932->decode($0); # $0はPerlの特殊変数でスクリプト名 printf STDERR "$sname: %.1f times\n",$duration/$passed if ($passed > 0); } }} 音声多重を速度を変えてエンコードするには2passにする。 #pre{{ #!/usr/bin/perl use utf8; # BS世界のドキュメンタリーのエンコード専用 # 速度を変えるため2回変換している。そうしないと音声多重放送では音ずれを # 防げないようだ。 my $serviceID = 101; my $fname = qr/^(BS世界のドキュメンタリー.+)\.ts$/; # .tsのあるディレクトリで実行。 # GUIから直接実行なら、終了後画面が閉じるのでSTDERRを保存する。 use strict; use warnings; use Encode; my $cp932 = find_encoding('cp932'); # http://gihyo.jp/dev/serial/01/modern-perl/0032?page=2 # 画面に出すならこのbinmode STDERR ...はwell works #binmode STDERR, ":encoding(cp932)"; # ('cp932')はNG # ファイルに出す close STDERR; open (STDERR, '>>:encoding(cp932)', 'ffmpeg.log') or die $!; $| = 1; # current directory use Cwd; my $wd = Cwd::getcwd(); # glob関数はWindowsでは正しく動かないという指摘あり(未確認) opendir my $dh, $wd or die "$wd:$!"; my @files = readdir $dh; closedir $dh; for (@files) { $_ = $cp932->decode($_); # 正規表現リテラルで検討するにはdecode必須。 next unless (/$fname/); # ファイル名をencodeしないと対外的な操作できない。 my $infile = $cp932->encode($_); my $middle = $cp932->encode($1) . '.mid.mp4'; my $outfile = $cp932->encode($1) . '.mp4'; my $mtime = (stat($infile))[9]; # 動画時間を取得し、何倍速でエンコードできたか表示する my $info = qx(ffprobe "$infile" -hide_banner -show_entries format=duration); # STDOUTにこれだけ返り、$infoに入る。 # [FORMAT] # duration=1808.072933 # [/FORMAT] my $duration = 0; if ($info =~ m|duration=([\d\.]+)|g) { $duration = $1; } my $stime = time; qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$infile" -vf "scale=1280:720" -global_quality 25 -c:v h264_qsv -ac 2 -map 0:p:$serviceID:0 -map 0:p:$serviceID:1 "$middle" ); qx(ffmpeg -y -hide_banner -nostats -init_hw_device qsv:hw -i "$middle" -vf "setpts=2/3*PTS" -af "atempo=1.5,pan=mono|c0=c0" -global_quality 25 -c:v h264_qsv "$outfile" ); # タイムスタンプ変更 utime($mtime, $mtime, $outfile) if -e $outfile; my $passed = time - $stime // 0; my $sname = $cp932->decode($0); # $0はPerlの特殊変数でスクリプト名 printf STDERR "$sname: %.1f times\n",$duration/$passed if ($passed > 0); } }}
タイムスタンプを変更しない
___paraedit_taxtarea___
テキスト整形のルールを表示する