トップ «前の日(10-19) 最新 次の日(10-21)» 追記

Masa's blog

検索キーワード:

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)