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)
[ツッコミを入れる]