2011年10月20日 ffmpeg, soxを使って動画音声の音声部分のピッチ(音程)を修正した
_ ffmpeg, soxを使って動画音声の音声部分のピッチ(音程)を修正した
minitubeでダウンロードしたドラマ(5つに分割されている)のうち、4つめの後半と5つめの音声ピッチ(音程)が妙に低くなっていて、登場人物のセリフが全てジャイアント馬場状態になっていた。
これをなんか修正して、普通に視聴できるようにしたいと思い、以下のように行った。
ffmpeg-0.8.5のインストール
$ tar xvjf ffmpeg-0.8.5.tar.bz2 $ cd ffmpeg-0.8.5 $ ./configure && make # make install
sox-14.3.2のインストール
$ tar sox-14.3.2.tar.gz $ cd sox-14.3.2 $ patch -p0 <sox-14.3.2.diff
*** src/ffmpeg.c.ORG 2011-10-18 18:16:18.889000037 +0900 --- src/ffmpeg.c 2011-10-18 18:17:59.688000036 +0900 *************** *** 91,97 **** if (!codec || avcodec_open(enc, codec) < 0) return -1; ! if (enc->codec_type != CODEC_TYPE_AUDIO) { lsx_fail("ffmpeg CODEC %x is not an audio CODEC", enc->codec_type); return -1; } --- 91,97 ---- if (!codec || avcodec_open(enc, codec) < 0) return -1; ! if (enc->codec_type != AVMEDIA_TYPE_AUDIO) { lsx_fail("ffmpeg CODEC %x is not an audio CODEC", enc->codec_type); return -1; } *************** *** 182,188 **** /* Find audio stream (FIXME: allow different stream to be selected) */ for (i = 0; (unsigned)i < ffmpeg->ctxt->nb_streams; i++) { AVCodecContext *enc = ffmpeg->ctxt->streams[i]->codec; ! if (enc->codec_type == CODEC_TYPE_AUDIO && ffmpeg->audio_index < 0) { ffmpeg->audio_index = i; break; } --- 182,188 ---- /* Find audio stream (FIXME: allow different stream to be selected) */ for (i = 0; (unsigned)i < ffmpeg->ctxt->nb_streams; i++) { AVCodecContext *enc = ffmpeg->ctxt->streams[i]->codec; ! if (enc->codec_type == AVMEDIA_TYPE_AUDIO && ffmpeg->audio_index < 0) { ffmpeg->audio_index = i; break; } *************** *** 273,279 **** c = st->codec; c->codec_id = codec_id; ! c->codec_type = CODEC_TYPE_AUDIO; /* put sample parameters */ c->bit_rate = 256000; /* FIXME: allow specification */ --- 273,279 ---- c = st->codec; c->codec_id = codec_id; ! c->codec_type = AVMEDIA_TYPE_AUDIO; /* put sample parameters */ c->bit_rate = 256000; /* FIXME: allow specification */ *************** *** 423,429 **** av_init_packet(&pkt); pkt.size = avcodec_encode_audio(c, ffmpeg->audio_buf_aligned, AVCODEC_MAX_AUDIO_FRAME_SIZE, ffmpeg->samples); pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, ffmpeg->audio_st->time_base); ! pkt.flags |= PKT_FLAG_KEY; pkt.stream_index = ffmpeg->audio_st->index; pkt.data = ffmpeg->audio_buf_aligned; --- 423,429 ---- av_init_packet(&pkt); pkt.size = avcodec_encode_audio(c, ffmpeg->audio_buf_aligned, AVCODEC_MAX_AUDIO_FRAME_SIZE, ffmpeg->samples); pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, ffmpeg->audio_st->time_base); ! pkt.flags |= AV_PKT_FLAG_KEY; pkt.stream_index = ffmpeg->audio_st->index; pkt.data = ffmpeg->audio_buf_aligned;
$ ./configure && make # make install
4つめ動画の修正
- 動画部分のみ抽出
ffmpeg -i M4-4.mp4 -an -vcodec msmpeg4v2 -vb 800k M4-4.mp4.avi
- 前半音声部分(368秒まで)のみ抽出
ffmpeg -i M4-4.mp4 -t 368 -vn -acodec mp2 -ab 224k M4-4.mp4.1.mp2
- 後半音声部分(368秒以降)のみ抽出
ffmpeg -i M4-4.mp4 -ss 368 -vn -acodec mp2 -ab 224k M4-4.mp4.2.mp2
- 後半音声部分のピッチを160セント上げる。このあたりは自己判断で...。(100セントは半音)
sox M4-4.mp4.2.mp2 M4-4.mp4.2.up160.mp2 pitch 160
- 前半音声部分とピッチを上げた後半音声部分を結合
sox M4-4.mp4.1.mp2 M4-4.mp4.2.up160.mp2 M4-4.mp4.new.mp2
- 動画部分と結合後音声部分をミックス
ffmpeg -i M4-4.mp4.avi -vcodec copy -i M4-4.mp4.new.mp2 -acodec copy M4-4.new.avi
- ミックスした動画音声をx264で再エンコード(2-pass)
mencoder -oac faac -faacopts br=96 -ovc x264 -x264encopts pass=1:bitrate=396 -o /dev/null M4-4.new.avi mencoder -oac faac -faacopts br=96 -ovc x264 -x264encopts pass=2:bitrate=396 -o M4-4.new.new.avi M4-4.new.avi
(同様に)5つめ動画の修正
ffmpeg -i M4-5.mp4 -an -vcodec msmpeg4v2 -vb 800k M4-5.mp4.avi ffmpeg -i M4-5.mp4 -vn -acodec mp2 -ab 224k M4-5.mp4.mp2 sox M4-5.mp4.mp2 M4-5.mp4.up160.mp2 pitch 160 ffmpeg -i M4-5.mp4.avi -vcodec copy -i M4-5.mp4.up160.mp2 -acodec copy M4-5.new.avi mencoder -oac faac -faacopts br=96 -ovc x264 -x264encopts pass=1:bitrate=396 -o /dev/null M4-5.new.avi mencoder -oac faac -faacopts br=96 -ovc x264 -x264encopts pass=2:bitrate=396 -o M4-5.new.new.avi M4-5.new.avi
その後
- M4-1.mp4, M4-2.mp4, M4-3.mp4を、それぞれ M4-1.avi, M4-2.avi, M4-3.avi(vcodec=x264, acodec=faac)に変換(by mencoder)
- M4-1.avi, M4-2.avi, M4-3.avi, M4-4.new.new.avi, M4-5.new.new.avi を連結してM04.aviを作成(by mencoder)
2015年10月20日 ether-wake for WOL(Wake on Lan)
_ ether-wake for WOL(Wake on Lan)
I installed ether-wake for WOL :)
$ tar xvvf etherwake-1.09.tar.gz $ cd etherwake-1.09 $ make ether-wake # cp ether-wake /usr/local/bin/
2017年10月20日 Using named pipe with PowerShell
_ `echo' Server
$shutdown = $false while (-not $shutdown){ $pipe = New-Object System.IO.Pipes.NamedPipeServerStream "NamedPipeForEcho",InOut $pipe.WaitForConnection() $buf = New-Object byte[] 1024 $loop = $true while($loop) { try { $len = $pipe.Read($buf, 0, $buf.Length) $cmd = [System.Text.Encoding]::Unicode.GetString($buf, 0, $len) if($cmd -match '^exit|^quit|^shutdown') { $loop = $false if($cmd -match '^shutdown') { $shutdown = $true } } else { $wb = [System.Text.Encoding]::Unicode.GetBytes($cmd) $pipe.Write($wb, 0, $wb.Length) } }catch{ $loop = $false } } $pipe.Close() }
_ Client
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream ".", "NamedPipeForEcho",InOut $pipe.Connect() $buf = New-Object byte[] 1024 $wb = [System.Text.Encoding]::Unicode.GetBytes("Hello, world.") $pipe.Write($wb, 0, $wb.Length) $len = $pipe.Read($buf, 0, $buf.Length) [System.Text.Encoding]::Unicode.GetString($buf, 0, $len) $wb = [System.Text.Encoding]::Unicode.GetBytes("exit") $pipe.Write($wb, 0, $wb.Length) #$wb = [System.Text.Encoding]::Unicode.GetBytes("shutdown") #$pipe.Write($wb, 0, $wb.Length)