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