Symfoware

Symfowareについての考察blog

avconv(ffmpeg) 動画ファイルから音声ファイルのみ抽出(aac,mp3)

動画(mp4)ファイルの音声のみをavconvで抽出してみます。

avconvのインストールはこちら。
avconv(ffmpeg)でmp4の動画ファイルからjpg形式で画像を取り出す


aac形式



こちらを参考にしました。
avconv


以下のコマンドで、aac形式で音声が抜き出せます。


# avconv -i target.mp4 -c:a copy -vn -y out.aac







mp3形式



mp3形式で出力する場合はこちらを参考にしました。
Converting WEBM to MP3

コーデックに「libmp3lame」を指定するか


# avconv -i target.mp4 -c:a libmp3lame -vn -y out.mp3




コーデック未指定で出力すれば良いようです。


# avconv -i target.mp4 out.mp3

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/01/24(火) 23:45:36|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

avconv(ffmpeg)でmp4の動画ファイルからjpg形式で画像を取り出す

Python YouTubeの動画をダウンロード(pytube,Pafy)

ここで取得したmp4形式の動画ファイルを1秒毎にjpg画像で切り出してみます。



avconv



画像の切り出しはdebian 8で行いました。

動画といえばffmpegだろうと思っていたのですが、
https://wiki.debian.org/ffmpeg

今はffmpegからフォークしたavconvがパッケージに登録されているようです。
apt-getでインストール。


# apt-get install libav-tools







画像の切り出し



ここが参考になりました。

https://gist.github.com/patrickward/7799742

https://wiki.libav.org/Snippets/avconv



# avconv -i target.mp4 -vsync 1 -r 1 -an -y -qscale 1 '%4d.jpg'



これで1秒毎に連番のjpgファイルが出力されました。
「-qscale 1」のオプションを指定して、jpgのクオリティーを上げておくと
劣化の少ない画像が取得できます。




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/24(火) 00:22:07|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Python YouTubeの動画をダウンロード(pytube,Pafy)

PythonでYouTubeの動画をダウンロードする方法を調べたところ、
pytubeとPafyというライブラリが有名なようです。

両方触ってみます。




pytube



こちらを参考にしました。
PythonでYouTubeの動画を自動的に検索ダウンロードする

ソースはこちら。
https://github.com/NFicano/pytube

easy_installでインストールしました。


# easy_install pytube




サンプルはこのようになります。


  1. # -*- coding:utf-8 -*-
  2. from pytube import YouTube
  3. yt = YouTube('https://www.youtube.com/watch?v=0E00Zuayv9Q')
  4. # ダウンロードできる形式を表示
  5. for video in yt.get_videos():
  6.     print video
  7. print '-' * 10
  8. # ファイル名を表示
  9. print(yt.filename)
  10. print '-' * 10
  11. # ダウンロードしたい形式を選択
  12. video = yt.get('mp4', '720p')
  13. # ダウンロードするファイル名を指定
  14. yt.set_filename('download_pytube')
  15. # ダウンロード実行
  16. video.download('./')




実行結果


# python sample.py
<Video: MPEG-4 Visual (.3gp) - 144p - Simple>
<Video: MPEG-4 Visual (.3gp) - 240p - Simple>
<Video: H.264 (.mp4) - 360p - Baseline>
<Video: H.264 (.mp4) - 720p - High>
<Video: VP8 (.webm) - 360p - N/A>
----------
PPAP(Pen-Pineapple-Apple-Pen Official)ペンパイナッポーアッポーペン/PIKOTARO(ピコ太郎)
----------




set_filenameでファイル名を指定していない場合は、元のファイル名
(yt.filenameで取得できた名称)で保存されました。



プログラムを記載しなくても、pytubeというコマンドに引数を指定することで
動画のダウンロードが行えます。


-e 動画形式[mp4]
-r 動画サイズ[720p]
-f ファイル名[down.mp4]
-p ダウンロードフォルダ[./Download]




mp4,720p,ファイル名down.mp4でダウンロードする場合はこんな感じになります。
※ファイルの拡張子は自動的に付与されるようです。


# pytube -e mp4 -r 720p -f down https://www.youtube.com/watch?v=0E00Zuayv9Q








Pafy



こちらを参考にしました。
pythonでyoutubeをナニするPafyがすごくべんり

ソースはこちら。
https://github.com/mps-youtube/pafy

easy_install でインストールしました。


# easy_install pafy




インストール後、importすると警告が表示されました。


>>> import pafy
WARNING:root:pafy: youtube-dl not found; falling back to internal backend.
This is not as well maintained as the youtube-dl backend.
To hide this message, set the environmental variable PAFY_BACKEND to "internal".




youtube-dlも合わせてインストールしておきました。


# easy_install youtube-dl





pytubeと同様のコードはこちら。


  1. # -*- coding:utf-8 -*-
  2. import pafy
  3. video = pafy.new('https://www.youtube.com/watch?v=0E00Zuayv9Q')
  4. # ダウンロードできる形式を表示
  5. for s in video.streams:
  6.     #print(s.resolution, s.extension, s.get_filesize(), s.url)
  7.     print(s.resolution, s.extension)
  8. print '-' * 10
  9. # ファイル名を表示
  10. print(video.title)
  11. print '-' * 10
  12. # 指定した形式で、一番高画質なものを選択
  13. best = video.getbest(preftype="mp4")
  14. print(best.resolution, best.extension)
  15. # ダウンロード
  16. best.download(filepath="./")




pytubeと同様、ytdlコマンドで操作が可能です。

とにかく一番よい画質の動画をダウンロードしたい場合


# ytdl -b "https://www.youtube.com/watch?v=0E00Zuayv9Q"





形式を指定してダウンロードしたい場合は一旦ストリームの情報を取得
※引数はyoutbueのURLのvパラメーター


# ytdl 0E00Zuayv9Q
Stream Type    Format Quality         Size            
------ ----    ------ -------         ----            
1     normal 3gp    [176x144]        0 MB        
2     normal 3gp    [320x180]        1 MB        
3     normal webm [640x360]        5 MB        
4     normal mp4    [640x360]        4 MB        
5     normal mp4    [1280x720]     10 MB        
6     audio m4a    [128k]         1 MB




ストリームの番号を指定してダウンロードします。
以下の指定で、4番(640x360のmp4)をダウンロード。


# ytdl -n4 0E00Zuayv9Q





【参考URL】

PythonでYouTubeの動画を自動的に検索ダウンロードする

https://github.com/NFicano/pytube

pythonでyoutubeをナニするPafyがすごくべんり

https://github.com/mps-youtube/pafy


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/23(月) 23:55:46|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

MariaDB 10.0で絵文字の寿司ビール問題に対応する

MySQL で utf8 と utf8mb4 の混在で起きること


MySQL の utf8 は4バイト文字を扱うことができません。



知らなかったです。
MariaDB 10.0でも同様の挙動なのか調べてみました。


テーブル



utf8とutf8mb4で同じレイアウトのテーブルを作成しました。


CREATE TABLE t_utf8 (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
value varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE t_utf8mb4 (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
value varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;







サンプルプログラム



CodeIgniterでデータベースを検索・登録するサンプルを作成してみます。

・application/controllers/Test.php


  1. <?php
  2. class Test extends CI_Controller {
  3.     
  4.     function __construct() {
  5.         parent::__construct();
  6.         
  7.         $this->load->database();
  8.         $this->load->helper('url_helper');
  9.         $this->load->library('form_validation');
  10.     }
  11.     
  12.     public function index() {
  13.         
  14.         $view_data = [];
  15.         
  16.         // 2つのテーブルを検索して、結果を表示
  17.         $view_data['utf8_rows'] = $this->db->get('t_utf8')->result_array();
  18.         $view_data['utf8mb4_rows'] = $this->db->get('t_utf8mb4')->result_array();
  19.         
  20.         $this->load->view('test', $view_data);
  21.         
  22.     }
  23.     
  24.     public function post() {
  25.         
  26.         // 入力チェックしつつ、入力が得られれば2つのテーブルにデータを登録
  27.         $this->form_validation->set_rules('input_text', 'text', 'required');
  28.         
  29.         if ($this->form_validation->run()) {
  30.             //検証通過ならデータベース登録
  31.             $data = [
  32.                 'value' => set_value('input_text')
  33.             ];
  34.             
  35.             $this->db->insert('t_utf8', $data);
  36.             $this->db->insert('t_utf8mb4', $data);
  37.         }
  38.         
  39.         $this->index();
  40.         
  41.     }
  42.     
  43. }





・application/views/test.php


  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4.     <meta charset="utf-8">
  5.     <title>utf8テスト</title>
  6. </head>
  7. <body>
  8. <div>
  9.     <form method="post" action="<?php echo site_url('test/post'); ?>">
  10.         <?php echo form_error('input_text'); ?>
  11.         <input type="text" name="input_text">
  12.         <input type="submit" value="登録">
  13.     </form>
  14. </div>
  15. <div>
  16.     <h3>UTF8</h3>
  17.     <ul>
  18.         <?php foreach($utf8_rows as $row): ?>
  19.         <li><?php echo $row['value']; ?></li>
  20.         <?php endforeach; ?>
  21.     </ul>
  22.     <h3>UTF8MB4</h3>
  23.     <ul>
  24.         <?php foreach($utf8mb4_rows as $row): ?>
  25.         <li><?php echo $row['value']; ?></li>
  26.         <?php endforeach; ?>
  27.     </ul>
  28. </div>
  29. </body>
  30. </html>






utf8



データベースの設定ファイル
application/config/database.php
これを以下のように設定しました。


  1. $active_group = 'default';
  2. $query_builder = TRUE;
  3. $db['default'] = array(
  4.     'dsn'    => '',
  5.     'hostname' => 'localhost',
  6.     'username' => 'root',
  7.     'password' => 'P@ssw0rd',
  8.     'database' => 'sample',
  9.     'dbdriver' => 'mysqli',
  10.     'dbprefix' => '',
  11.     'pconnect' => FALSE,
  12.     'db_debug' => (ENVIRONMENT !== 'production'),
  13.     'cache_on' => FALSE,
  14.     'cachedir' => '',
  15.     'char_set' => 'utf8',
  16.     'dbcollat' => 'utf8_general_ci',
  17.     'swap_pre' => '',
  18.     'encrypt' => FALSE,
  19.     'compress' => FALSE,
  20.     'stricton' => FALSE,
  21.     'failover' => array(),
  22.     'save_queries' => TRUE
  23. );




utf8指定です。


日本語の登録、検索は問題なし。

729_01.png

729_02.png


絵文字を登録してみます。
入力は「🍣🍺は最高!」

729_03.png

729_04.png


utf8は空白、utf8mb4は文字化けした状態で登録されました。
utf8、入力チェックの検証を通過しつつ空白で登録されてしまいます。


MariaDB [sample]> select * from t_utf8;
+----+--------------------------+
| id | value                    |
+----+--------------------------+
| 1 | 日本語登録テスト         |
| 2 |                         |
+----+--------------------------+
2 rows in set (0.00 sec)

MariaDB [sample]> select * from t_utf8mb4;
+----+--------------------------+
| id | value                    |
+----+--------------------------+
| 1 | 日本語登録テスト         |
| 2 | ????????は最高!         |
+----+--------------------------+
2 rows in set (0.00 sec)








utf8mb4



データベース接続設定を変更します。


  1. $active_group = 'default';
  2. $query_builder = TRUE;
  3. $db['default'] = array(
  4.     'dsn'    => '',
  5.     'hostname' => 'localhost',
  6.     'username' => 'root',
  7.     'password' => 'P@ssw0rd',
  8.     'database' => 'sample',
  9.     'dbdriver' => 'mysqli',
  10.     'dbprefix' => '',
  11.     'pconnect' => FALSE,
  12.     'db_debug' => (ENVIRONMENT !== 'production'),
  13.     'cache_on' => FALSE,
  14.     'cachedir' => '',
  15.     'char_set' => 'utf8mb4',
  16.     'dbcollat' => 'utf8mb4_general_ci',
  17.     'swap_pre' => '',
  18.     'encrypt' => FALSE,
  19.     'compress' => FALSE,
  20.     'stricton' => FALSE,
  21.     'failover' => array(),
  22.     'save_queries' => TRUE
  23. );




日本語の登録は問題なし。

729_05.png

729_06.png


「🍣🍺は最高!」を登録してみます。

絵文字を含む文字列はutf8は絵文字の部分が文字化け。
utf8mb4は正常登録という結果になりました。

729_07.png

729_08.png



知らないって罪ですね...
MySQLだけでなく、MariaDBでもutf8mb4を使用したほうが良さそうです。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/22(日) 23:06:40|
  2. MySQL
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

OpenCV 3.2をDebian 8にインストールする

OpenCV
2017.1.22時点で最新版の3.2をDebian 8にインストールしてみます。



インストールスクリプト



ソースからビルドしてインストールします。
・・・が依存しているライブラリが多く、インストールは結構面倒なようです。

調べてみると、親切な方がインストールスクリプトを公開してくださっています。
http://milq.github.io/install-opencv-ubuntu-debian/

これを使わせていただくことにしました。


まず、実行に必要なライブラリをインストール。


# apt-get install sudo wget




apt版のopencvがインストールされている場合は、事前に削除しておきます。


# apt-get autoremove libopencv-dev python-opencv




インストールスクリプトをダウンロードして実行。


# cd /usr/local/src/
# wget --no-check-certificate https://raw.githubusercontent.com/milq/scripts-ubuntu-debian/master/install-opencv.sh
# chmod +x install-opencv.sh
# ./install-opencv.sh



これでインストール完了です。
※私の環境では、インストールに20分程度必要でした




Pythonから呼び出しとバージョン確認



Python2からcv2をインポート。
バージョンを確認してみます。


# python
Python 2.7.9 (default, Jun 29 2016, 13:08:31)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




Python3も同様に試してみます。


# python3
Python 3.4.2 (default, Oct 8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'




ちゃんとインポートできていますね。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/01/22(日) 22:40:15|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
前のページ 次のページ