ffmpeg – matoken's blog https://matoken.org/blog Is there no plan B? Tue, 31 Mar 2026 22:10:49 +0000 ja hourly 1 https://wordpress.org/?v=7.0 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg ffmpeg – matoken's blog https://matoken.org/blog 32 32 Twitterで配信された動画アーカイブをダウンロード https://matoken.org/blog/2026/04/01/twitter-broadcast-download/ https://matoken.org/blog/2026/04/01/twitter-broadcast-download/#respond Tue, 31 Mar 2026 22:10:47 +0000 https://matoken.org/blog/?p=5405

Twitterで配信されたライブ動画のアーカイブをダウンロードしてみました.

とあるイベントがTwitter で配信されていたらしくYouTube にもあるのではと思ったけど見当たりません.Twitter にアーカイブが残っているのですが,なんか再生がすぐ止まるので辛い.
ということでダウンロードできないかなと検索するとX/Twitter Broadcast Downloader というものを見つけました.これでダウンロードしてみました.

venv 環境に導入して試す.
$ git clone https://github.com/offish/twitter-x-broadcast-downloader (1)
$ cd twitter-x-broadcast-downloader
$ python3 -m venv venv (2)
$ source venv/bin/activate (3)
$ pip install -r "requirements.txt" (4)
$ python main.py (5)
What is the broadcast URL? https://x.com/i/broadcasts/1qGvvkWeqdBGB (6)
Got media key 28_2038539604165640192
Got playback URL https://prod-fastly-ap-northeast-1.video.pscp.tv/Transcoding/v1/hls/PTdVIXd-pzzuOcGNlng6TG9haAxe5-rcN7QaIridcZbNbingfwGFrSiqe9DsliGqOpoLNO8lZ2Pk9a_owkY3aw/non_transcode/ap-northeast-1/periscope-replay-direct-prod-ap-northeast-1-public/master_dynamic_16671870457049479117.m3u8?type=replay
Downloading the broadcast as 28_2038539604165640192.mp4...
[generic] Extracting URL: https://prod-fastly-ap-northeast-1.video.pscp.tv/Transcoding/v1/hls/PTdVIXd-pzzuOcGNlng6TG9haAxe5...117.m3u8?type=replay
[generic] master_dynamic_16671870457049479117: Downloading webpage
[generic] master_dynamic_16671870457049479117: Downloading m3u8 information
[generic] master_dynamic_16671870457049479117: Checking m3u8 live status
[info] master_dynamic_16671870457049479117: Downloading 1 format(s): 5500
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 6385
[download] Destination: /home/matoken/src/twitter-x-broadcast-downloader/downloads/28_2038539604165640192.mp4
[download] 100% of    3.64GiB in 00:03:49 at 16.24MiB/s
[FixupM3u8] Fixing MPEG-TS in MP4 container of "/home/matoken/src/twitter-x-broadcast-downloader/downloads/28_2038539604165640192.mp4"


What is the broadcast URL? (7)
  1. source clone

  2. venv 環境を作る

  3. venv を有効に

  4. venv 環境にインストール

  5. X/Twitter Broadcast Downloader を実行

  6. ダウンロードしたいURL を渡す

  7. 次のダウンロードしたいURL 待ち

ダウンロードできました.

$ ls -lA downloads/
total 3722204
-rw-rw-r-- 1 matoken matoken 3811532277 Mar 31 18:03 28_2038539604165640192.mp4
-rw-rw-r-- 1 matoken matoken          0 Mar 31 17:57 .gitkeep
$ ffprobe downloads/28_2038539604165640192.mp4 2>&1 | grep -A 99 ^Input
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'downloads/28_2038539604165640192.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf61.7.100
  Duration: 03:35:23.76, start: 0.000000, bitrate: 2359 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 2187 kb/s, 30 fps, 30 tbr, 90k tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]

以下余録.

リモートのVPS でダウンロードしたのですが結構大きいので小さくしてダウンロードします.

ffmpeg コマンドで動画を小さく
$ ffmpeg -i downloads/28_2038539604165640192.mp4 -vcodec libx264 -crf 33 -vf "scale=720:-2" -c:a copy downloads/28_2038539604165640192-720.mp4
$ ls -1s downloads/
total 4172176
 449972 28_2038539604165640192-720.mp4
3722204 28_2038539604165640192.mp4
動画の音声を取り出してWhisper.cpp で字幕作成
$ ffmpeg -i ~/Downloads/28_2038539604165640192-720.mp4 -ar 44100 -ac 1 -sample_fmt s16 -af silenceremove=1:0:-50dB  clawcon.wav
$ ./build/bin/whisper-cli -m ./models/ggml-large-v3-turbo.bin --output-srt --language auto -f ./clawcon.wav
$ ls -1s clawcon.wav*
1067548 clawcon.wav
    152 clawcon.wav.srt
$ head  clawcon.wav.srt
1
00:00:00,000 --> 00:00:06,660
Alright everyone, we'll be starting in 10 minutes. Please make your way to the stage area. We'll be starting in 10 minutes.

2
00:00:30,000 --> 00:00:59,980
 Thank you.

3
00:01:00,000 --> 00:01:29,980
ダウンロード環境
$ dpkg-query -W python3 python3-venv ffmpeg
ffmpeg  7:7.1.3-0+deb13u1
python3 3.13.5-1
python3-venv    3.13.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux 13 (trixie)
Release:        13
$ arch
x86_64
動画編集,文字起こし環境
$ dpkg-query -W ffmpeg
ffmpeg  7:8.1-3+b1
a$ git remote -v
origin  https://github.com/ggerganov/whisper.cpp.git (fetch)
origin  https://github.com/ggerganov/whisper.cpp.git (push)
$ git log --pretty=oneline -1
95ea8f9bfb03a15db08a8989966fd1ae3361e20d (HEAD -> master, origin/master, origin/HEAD) sync : ggml
$ lsb_release -dr
Description:    Debian GNU/Linux forky/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2026/04/01/twitter-broadcast-download/feed/ 0
YoutubeをWebpageに変換するYoutube2Webpage https://matoken.org/blog/2023/09/07/youtube2webpage/ https://matoken.org/blog/2023/09/07/youtube2webpage/#respond Wed, 06 Sep 2023 21:28:36 +0000 https://matoken.org/blog/?p=3917

YoutubeをWebpage に変換する Youtube2Webpage を少し試してみました.

これは yt-dlp でYoutube から動画と文字起こしファイルを入手し,文字起こし部分のスクリーンショットを取得してWebpage にするというもののようです.

試しにオープンソースカンファレンスの動画を変換してみました.

$ sudo apt install yt-dlp ffmpeg (1)
$ git clone https://github.com/obra/Youtube2Webpage
$ cd Youtube2Webpage
$ ./yt-to-webpage.pl "【MTG】NetBSDのご紹介 2023-7-29 C-5" 'https://www.youtube.com/watch?v=TnviEtERcVw' (2)
$ python3 -m http.server --bind 127.0.0.1 --directory ./"【MTG】NetBSDのご紹介 2023-7-29 C-5" 8080 (3)
$ xdg-open http://127.0.0.1:8080/index.html (4)
  1. yt-dlp と ffmpeg を導入
  2. 任意のタイトルとYoutube URL を指定して実行
  3. httpd を起動
  4. ウェブブラウザで開く

youtube2webpage

変換されています.
眺めてみるとまず文字起こし翻訳ファイルで en のものが使われています.
そして元動画でWebPage を画面共有しているのであまりスクリーンショットから内容がよくわかりません.

まず文字起こしテキストは --sub-langs ja オプションを付けて日本語を利用するようにしました.

$ git diff ./yt-to-webpage.pl
diff --git a/yt-to-webpage.pl b/yt-to-webpage.pl
index 41b8acf..4174658 100755
--- a/yt-to-webpage.pl
+++ b/yt-to-webpage.pl
@@ -15,7 +15,7 @@ if (!$url || $url !~ m|^https://www.youtube.com|) {

 mkdir($slug);
 chdir($slug);
-my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs "$url" --print filename --no-simulate`;
+my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs --sub-langs ja "$url" --print filename --no-simulate`;
 chomp($video_file);
 my ($vtt) = glob('*.vtt');
 open(my $fh, "<", $vtt);

画像サイズについては,抜き出された画像群のサイズはそこそこ大きいです.css でサイズに制限がかかってるので大きくしました.

$ git diff ./styles.css
diff --git a/styles.css b/styles.css
index 156f994..8972e87 100644
--- a/styles.css
+++ b/styles.css
@@ -56,8 +56,8 @@ li {
 }

 li img{
-    max-width: 288px;
-    max-height: 216px;
+    max-width: 1280px;
+    max-height: 720px;
     transition: all 0.3s;
 }

これで再度コマンドを実行するとファイルがすでにあるというエラーに.一旦ディレクトリごと消して再度実行すると日本語文字起こしテキストかつサイズの大きい画像になりました.

後は文字起こしテキストの精度が悪いですね.(“NetBSD” が “Netflix” や “ネットビジネス” になってたり……)でもこれはYoutube のせいでこのscript の問題ではないです.自分の管理下の動画ならYoutube に任せずOpenAI のWhisper(.cpp) などで文字起こしして手直し後Youtube にアップロードして差し替えるのがいいんでしょうね.

]]>
https://matoken.org/blog/2023/09/07/youtube2webpage/feed/ 0
Twitter Spacesをダウンロードして無音部分をカットして聞く https://matoken.org/blog/2022/03/17/download-twitter-spaces-and-cut-the-silence-to-listen/ https://matoken.org/blog/2022/03/17/download-twitter-spaces-and-cut-the-silence-to-listen/#respond Wed, 16 Mar 2022 21:09:36 +0000 http://matoken.org/blog/?p=3544

Twitter Scapesという音声配信サービスがありますが,基本的にライブ.聴きたいものがあったのですが,体調不良で寝ていて聞けませんでした.
でも30日アーカイブが残るとのことなのでダウンロードしてスマホで聞いてみました.

まずはダウンロード,Youtube-dl, yt-dlpを試しましたがまだ未対応のよう.

今回Twspace-dlというものを試しました.

$ virtualenv .
$ source bin/activate
$ pip install twspace-dl
$ twspace_dl
usage: twspace_dl [-h] [-v] [-s] [-k] [-l] [--input-cookie-file COOKIE_FILE] [--username USERNAME]
                  [--password PASSWORD] [--output-cookie-file OUTPUT_COOKIE_FILE] [-i SPACE_URL | -U USER_URL]
                  [-d DYN_URL] [-f URL] [-M PATH] [-o FORMAT_STR] [-m] [-p] [-u] [--write-url URL_OUTPUT]

Script designed to help download twitter spaces

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose
  -s, --skip-download
  -k, --keep-files
  -l, --log             create logfile
  --input-cookie-file COOKIE_FILE

input:
  -i SPACE_URL, --input-url SPACE_URL
  -U USER_URL, --user-url USER_URL
  -d DYN_URL, --from-dynamic-url DYN_URL
                        use the dynamic url for the processes(useful for ended spaces) example: https://prod-
                        fastly-ap-
                        northeast-1.video.pscp.tv/Transcoding/v1/hls/zUUpEgiM0M18jCGxo2eSZs99p49hfyFQr1l4cdze-
                        Sp4T-DQOMMoZpkbdyetgfwscfvvUkAdeF-I5hPI4bGoYg/non_transcode/ap-northeast-1/periscope-
                        replay-direct-prod-ap-northeast-1-public/audio-space/dynamic_playlist.m3u8?type=live
  -f URL, --from-master-url URL
                        use the master url for the processes(useful for ended spaces) example: https://prod-
                        fastly-ap-northeast-1.video.pscp.tv/Transcoding/v1/hls/YRSsw6_P5xUZHMualK5-ihvePR6o4Qmo
                        ZVOBGicKvmkL_KB9IQYtxVqm3P_vpZ2HnFkoRfar4_uJOjqC8OCo5A/non_transcode/ap-
                        northeast-1/periscope-replay-direct-prod-ap-northeast-1-public/audio-
                        space/master_playlist.m3u8
  -M PATH, --input-metadata PATH
                        use a metadata json file instead of input url (useful for very old ended spaces)

output:
  -o FORMAT_STR, --output FORMAT_STR
  -m, --write-metadata  write the full metadata json to a file
  -p, --write-playlist  write the m3u8 used to download the stream(e.g. if you want to use another downloader)
  -u, --url             display the master url
  --write-url URL_OUTPUT
                        write master url to file

login:
  --username USERNAME
  --password PASSWORD
  --output-cookie-file OUTPUT_COOKIE_FILE

早速ダウンロード

$ twspace_dl -i https://twitter.com/i/spaces/1ypKdEXLdLqGW

2022-03-16 15:42:16,496 [INFO] ./tmp6swcs0w5/(辻 伸弘 (nobuhiro tsuji))ゆくアレ、くるアレ #セキュリティのアレ-1ypKdEXLdLqGW.m3u8 written to disk
[hls @ 0x55f2ea4a9800] Changing ID3 metadata in HLS audio elementary stream is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
size=   51141kB time=01:13:21.68 bitrate=  95.2kbits/s speed=10.6x
2022-03-16 15:49:14,334 [INFO] Finished downloading
$ ffprobe -i ./\(辻\ 伸弘\ \(nobuhiro\ tsuji\)\)ゆくアレ、くるアレ\ #セキュリティのアレ-1ypKdEXLdLqGW.m4a
ffprobe version 4.4.1-3+b2 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 11 (Debian 11.2.0-18)
  configuration: --prefix=/usr --extra-version=3+b2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './(辻 伸弘 (nobuhiro tsuji))ゆくアレ、くるアレ #セキュリティのアレ-1ypKdEXLdLqGW.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 512
    compatible_brands: M4A isomiso2
    title           : ゆくアレ、くるアレ #セキュリティのアレ
    artist          : 辻 伸弘 (nobuhiro tsuji)
    encoder         : Lavf58.76.100
    episode_id      : 1ypKdEXLdLqGW
  Duration: 01:13:21.71, start: 0.000000, bitrate: 95 kb/s
  Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 93 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

ダウンロードできました.再生してみると音が出ない??先頭に無音が入ってるせいで少し進めると音が出ました.

てことで先日も使った ffmppegsilenceremove フィルタで無音部分をカットします.

しきい値は前回と同じ -90dB だとほとんどカットできまぜんでした. -50dB でいい感じになったようです.

$ ffmpeg -i ./\(辻\ 伸弘\ \(nobuhiro\ tsuji\)\)ゆくアレ、くるアレ\ #セキュリティのアレ-1ypKdEXLdLqGW.m4a -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-50dB -acodec libopus ./\(辻\ 伸弘\ \(nobuhiro\ tsuji\)\)ゆくアレ、くるアレ\ #セキュリティのアレ-1ypKdEXLdLqGW.opus

01:13:21.71 → 01:09:51.71 になりました.てことでこれでスマホに転送して聞くことが出来ました.

Twitter Space podcast 50

ちなみに今回試した配信はPodcastの「セキュリティのアレ」の「サイバーセキュリティに関する総務大臣奨励賞」の受賞記念配信的なものでした.いつもは週一くらいでPodcastを配信されています.

#最近はPodcastの露出が増えている感じ.過去に配信して止まっている番組も復活しないかな電カーとかちんさんとか…….

環境
$ dpkg-query -W python3 ffmpeg
ffmpeg  7:4.4.1-3+b2
python3 3.9.8-1
$ lsb_release -dr
aDescription:   Debian GNU/Linux bookworm/sid
Release:        unstable
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/17/download-twitter-spaces-and-cut-the-silence-to-listen/feed/ 0
YouTube動画をダウンロードして無音部分をカットしたオーディオデータにして聞く https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/ https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/#respond Sun, 13 Mar 2022 14:40:28 +0000 http://matoken.org/blog/?p=3531

オープンソースカンファレンス2022 Online Springに参加しました.

ビデオミーティングソフトウェアのZoomとYouTube Liveを使っています.セッションは複数トラックあって同時に参加するのは難しいです.ほとんどのセッションは後日YouTubeで公開されますが,YouTube Liveの動画をリモートのサーバで録画しておいたのでこれをスマートフォンで移動中などに聞けるようにしてみました.

YouTubeの動画ダウンロードにはyoutube-dlやyt-dlpが便利です.セッション毎に起動しておきました.

$ youtube-dl ${URL}
$ yt-dlp ${URL}

今回ダウンロードした動画はvp9+aacのようです.

$ ffprobe -i ./YOUTUBEFILE.mkv 2>&1 | grep ^Input -A99
Input #0, matroska,webm, from './YOUTUBEFILE.mkv':
  Metadata:
    HTTP://YOUTUBE.COM/STREAMING/OTF/DURATIONS/112015: Segment-Count: 6109
                    : Segment-Durations-Ms: 5067,5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),506
                    :
                    :
    ENCODER         : Lavf58.20.100
  Duration: 08:35:50.04, start: 0.000000, bitrate: 551 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709/unknown/unknown), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 08:35:49.996000000
    Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : ISO Media file produced by Google Inc.
      DURATION        : 08:35:50.040000000

ffmpegで音声だけを抜き出してみます.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec copy ./YOUTUBEFILE.aac

元ファイルが2GBほどに対して500MBほどのファイルになりました.
ちょっと大きいのでコーデックをopusに変更してみます.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec libopus -b:a 64k ./YOUTUBEFILE.opus

213MB程になりました.
これをローカルにダウンロードして再生してみるとセッション間の無音部分が気になります.無音部分をカットできないかなと探すと,ffmpegのフィルタにそれらしい silenceremove というフィルタがあったので試してみました.

とりあえずexampleを真似して,先頭から最後までの間の1秒以上の無音部分をカットします.ついでにビットレートも32kに下げました.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB -acodec libopus -b:a 32k ./YOUTUBEFILE.opus

動画ファイルの長さが 08:35:50.040000000 から 07:55:03.66 になりました.ファイルサイズは107MB程です.

ついでにもう少し低いビットレートも試しました.

ビットレート 容量

32k

107324kB

24k

82484kB

16k

56380kB

少し聞いた感じでは16kでも問題無さそうな感じです.大本のZoomが確か24kなので24k以上はあまり意味がない気がします.

追記)高音質化機能があるようなので動画によって変わりそうです:

High Fidelity Audio mode – Windows, macOS
This option in Advanced Audio enhances “Original Audio” mode, allowing for disabling echo cancellation & post-processing, while raising audio codec quality to 48Khz, 96Kbps mono/192kbps stereo for professional audio transmis
sion in music education and performance applications. Professional audio interface, microphone, and headphones required.

Release notes for September 1
2020 – Zoom Support https://support.zoom.us/hc/en-us/articles/360048388632-New-Updates-for-September-1-2020

ということで他のセッションも同様に変換してAndroidスマートフォンに転送してVLCで1.5倍再生してみて画面スリープで再生できるのを確認しました.これで空き時間に聞けるようになりました :)

youtube2audio

応用としてYouTubeのRSSから動画をダウンロードして音声のみにしてその音声をRSSに埋め込んで公開するとPodcastアグリゲーターで購読できるので便利かもしれません.人の動画を勝手に一般公開するとまずいでしょうが.

環境
$ youtube-dl --version
2021.12.17
$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W ffmpeg
ffmpeg  7:4.1.8-0+deb10u1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/feed/ 0
YoutubeLiveを音声のみで視聴する試み https://matoken.org/blog/2020/05/12/attempt-to-watch-youtubelive-with-audio-only/ https://matoken.org/blog/2020/05/12/attempt-to-watch-youtubelive-with-audio-only/#respond Tue, 12 May 2020 07:52:04 +0000 http://matoken.org/blog/?p=2736

Youtubeの動画には音声のみのストリームがあるのでこれをダウンロードしてpodcast的に聞いたりすることがあるのですが,YoutubeLiveには音声のみのストリームはないようです.

Youtube動画
$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=PNWQvqUUHbQ
[youtube] PNWQvqUUHbQ: Downloading webpage
[youtube] PNWQvqUUHbQ: Downloading MPD manifest
[info] Available formats for PNWQvqUUHbQ:
format code  extension  resolution note
251          webm       audio only DASH audio    3k , webm_dash container, opus @160k (48000Hz)
139          m4a        audio only DASH audio   49k , m4a_dash container, mp4a.40.5@ 48k (22050Hz)
140          m4a        audio only DASH audio  130k , m4a_dash container, mp4a.40.2@128k (44100Hz)
278          webm       256x144    DASH video   95k , webm_dash container, vp9, 30fps, video only
160          mp4        256x144    DASH video  108k , mp4_dash container, avc1.4d400b, 30fps, video only
242          webm       426x240    DASH video  220k , webm_dash container, vp9, 30fps, video only
133          mp4        426x240    DASH video  242k , mp4_dash container, avc1.4d400c, 30fps, video only
243          webm       640x360    DASH video  405k , webm_dash container, vp9, 30fps, video only
134          mp4        640x360    DASH video  463k , mp4_dash container, avc1.4d401e, 30fps, video only
244          webm       854x480    DASH video  752k , webm_dash container, vp9, 30fps, video only
135          mp4        854x480    DASH video 1155k , mp4_dash container, avc1.4d4014, 30fps, video only
247          webm       1280x720   DASH video 1505k , webm_dash container, vp9, 30fps, video only
136          mp4        1280x720   DASH video 2007k , mp4_dash container, avc1.4d401f, 30fps, video only
18           mp4        640x360    360p  494k , avc1.42001E, 30fps, mp4a.40.2@ 96k (44100Hz), 1.34MiB
22           mp4        1280x720   720p 1788k , avc1.64001F, 30fps, mp4a.40.2@192k (44100Hz) (best)
YoutubeLive
$ youtube-dl --ignore-config -F https://www.youtube.com/watch?v=XXXX-XXXXXX 2>/dev/null
[youtube] XXXX-XXXXXX: Downloading webpage
[youtube] XXXX-XXXXXX: Downloading m3u8 information
[youtube] XXXX-XXXXXX: Downloading MPD manifest
[info] Available formats for XXXX-XXXXXX:
format code  extension  resolution note
91           mp4        256x144    HLS  197k , avc1.42c00b, 30.0fps, mp4a.40.5@ 48k
92           mp4        426x240    HLS  338k , avc1.4d4015, 30.0fps, mp4a.40.5@ 48k
93           mp4        640x360    HLS  829k , avc1.4d401e, 30.0fps, mp4a.40.2@128k
94           mp4        854x480    HLS 1380k , avc1.4d401f, 30.0fps, mp4a.40.2@128k
95           mp4        1280x720   HLS 2593k , avc1.4d401f, 30.0fps, mp4a.40.2@256k (best)

これをリモートサーバでaudioのみに変換してしまうと細い回線で音声だけ聞くことが出来るのではと試してみました.
(屋外移動中などに聞くのを想定)

YoutubeLiveのダウンロードには youtube-dl ,変換には ffmpeg を利用しました.

youtube-dl についてはこのあたりを参考にしてください.

以下ではyoutube-dlで最低画質の動画(フォーマットコード91)の144p/48kな動画をダウンロードして標準出力に渡して,パイプでffmpegで受け取って音声だけ切り出して udp:1234 に配信しています.音質をあげたい場合は360pで128k,720pで256kのようなので対応の動画を選ぶと良いですね.

$ youtube-dl -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts udp://127.0.0.1:1234

この状態で ffplay で受信して再生できました :)

$ ffplay udp://127.0.0.1:1234

リモートのVPSサーバとかでこれをやると外出先でMVNOの低速モードでの受信も問題なさそうです.
自分だけで聞く分にはこれでいいのですが,自分の配信したYoutubeLiveを多人数に音声を配信して聞いてもらいたいなどの場合には使えません.(他の人のものを勝手に不特定配信は駄目)

そこで Icecast2 に流すのも試してみました.
ほほ同じようにして流せました.PCとAndroid端末でモバイル回線の低速モードでも試してみたところ同時に視聴できました :)

$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest
peeでデータを2つに分けてモニタしながらとかも
$ youtube-dl --ignore-config -f 91 $YOUTUBELIVEURL -o - | pee "ffplay -" "ffmpeg -i - -c:a copy -vn -f adts -content_type audio/aac iceca
st://source:password@icecast2.example.org:8000/youtubelivetest"

youtubelive2icecast2

$ mpv http://icecast2.example.org:8000/youtubelivetest.m3u

Playing: http://icecast2.example.org:8000/youtubelivetest
 (+) Audio --aid=1 (aac 2ch 48000Hz)
AO: [pulse] 48000Hz stereo 2ch float
A: 00:00:02 / 00:00:10 (24%) Cache: 7.9s/139KB
File tags:
 icy-title:
A: 00:00:22 / 00:00:30 (75%) Cache: 7.1s/126KB

YoutbeLive,Icecast2と間にサービスを挟むと遅延はどんどん大きくなるので余裕があったらYoutubeLiveに流すのと同じマシンで直接icecast2に流したほうがいいでしょうね.

懸念点としてはYoutubeのシステム的にこの視聴方法で視聴者数や視聴時間に貢献できるのかというところ.とりあえずは家に帰ったらウェブブラウザ等で視聴し直したり,リモートサーバでウェブブラウザを起動してYoutubeLiveを再生してその音声を取り込んだりするか…….そうなってくるとOBS Studio等を使ったほうがわかりやすいかもしれないですね.

しかし,値段だけ考えると特定のサービスで容量を消費しないカウントフリー,エンタメフリーオプション等でYoutubeに対応したSIMを使うという手も使えそうです.
自分は意思が弱く利用サービスがカウントフリーのものに偏ったりしそうだし,通信を見られるのが嫌なので今のところ使う予定はないです.

クライアント環境
$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg mpv
ffmpeg  7:4.2.2-1+b1
mpv     0.32.0-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
Icecast2環境
$ youtube-dl --version
2020.05.03
$ dpkg-query -W ffmpeg icecast2
ffmpeg  7:4.1.4-1~deb10u1
icecast2        2.4.4-1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64

]]>
https://matoken.org/blog/2020/05/12/attempt-to-watch-youtubelive-with-audio-only/feed/ 0
ffmpegでgifからmp4に変換した動画がInstagramに投稿できない https://matoken.org/blog/2019/10/05/videos-converted-from-gif-to-mp4-with-ffmpeg-cannot-be-posted-on-instagram/ https://matoken.org/blog/2019/10/05/videos-converted-from-gif-to-mp4-with-ffmpeg-cannot-be-posted-on-instagram/#respond Sat, 05 Oct 2019 12:40:59 +0000 http://matoken.org/blog/?p=2550

先日のttygifで作成したanimation gifをInstagramに投稿しようとしたところ,animation gifは投稿できるけどanimationせず1枚目の画像が表示されるだけです.ffmpegでmp4に変換するだけで良さそうだけど投稿できません.白い動画でプログレスがずっと表示され,「次へ」を押すとアプリ自体が落ちてしまいます.動画は同端末のvlcなどでは問題なく再生できています.

IMG 20191005 195714

$ ffmpeg -i tty.gif tty.mp4

音声がないのがいけないのかな?と anullsrc フィルタで無音の音声トラックを追加してみても変わらず.

$ ffmpeg -f lavfi -i anullsrc -i tty.gif -shortest tty.mp4

手詰まりになって検索してみると以下のページを発見.

このページによると以下の条件で投稿できないようです.

  • 3秒以下の動画
  • Instagramが受け付けないカラーエンコーディングの利用

今回の動画は20秒ほどなので長さは問題無さそうです.

うまく行っていなかった動画を確認すると元記事と同様 yuv444p を使っているようです.

$ ffprobe tty.mp4 2>&1 | grep -E "Stream.*Video"
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 802x750, 73 kb/s, 4.17 fps, 4.17 tbr, 12800 tbn, 8.33 tbc (default)

てことで,以下のようにカラーエンコーディングに yuv420p を指定して変換すると投稿できました.(音声トラックはあってもなくてもどちらでもOKだった)

$ ffmpeg -i tty.gif -pix_fmt yuv420p -filter_complex "scale=trunc(iw/2)*2:trunc(ih/2)*2" tty.mp4
$ ffprobe tty.mp4 2>&1 | grep -E "Stream.*Video"
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1058x750, 97 kb/s, 16.08 fps, 16.08 tbr, 12352 tbn, 32.17 tbc (default)

この投稿をInstagramで見る

pfetch logo #unix

matokenさん(@matoken)がシェアした投稿 –

公式の文章があればいいんですが見つからず.以下が少し近い?

変換環境
$ dpkg-query -W ffmpeg
ffmpeg	7:4.1.4-1+b2
$ lsb_release -dr
Description:	Debian GNU/Linux bullseye/sid
Release:	unstable
$ uname -m
x86_64
投稿環境
$ adb shell dumpsys package com.instagram.android | grep -E 'versionCode|versionName'
    versionCode=175574628 minSdk=23 targetSdk=28
    versionName=113.0.0.39.122
$ adb shell getprop ro.bootimage.build.fingerprint
essential/mata/mata:10/QP1A.190711.122/420:user/release-keys
$ adb shell getprop ro.build.version.security_patch
2019-09-05
$ adb shell getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi
]]>
https://matoken.org/blog/2019/10/05/videos-converted-from-gif-to-mp4-with-ffmpeg-cannot-be-posted-on-instagram/feed/ 0
ストリーミング配信補助ソフトのCastawesomeを試す https://matoken.org/blog/2016/03/05/try-castawesome-streaming-auxiliary-software/ https://matoken.org/blog/2016/03/05/try-castawesome-streaming-auxiliary-software/#respond Sat, 05 Mar 2016 14:53:07 +0000 http://matoken.org/blog/?p=1272

3/5はOpenDataDayでした.
去年までは鹿児島市で募ってMapCafeと称してOSMする集まりをしていたのですが人が集まらないので今年は家で地図を書こうかと.そしてそのデスクトップをストリーミングしてみようかなと.

ということデスクトップストリーミングの話です.

いつものようにffmpegでRTMP配信なのですが,今回はCastawesomeというGUIの皮を見つけたので試してみました.これを使うとオプションなどがGUIで入力するだけで埋まっていくので便利です.

導入はcloneした後makeするだけ.システムに導入したいならmake installも.(Raspberry Piでも動きました.)
ffmpeg or avconvとPython 3, GTK-3ライブラリなどが必要です.(make時に足りないものがある場合DEPENDSが参考になります)

$ git clone -b 0.16.0 https://github.com/TheSamsai/Castawesome.git
$ cd Castawesome
$ make

の後

$ ./castawesome.py

or

$ sudo make install

してスタートメニューから実行.

こんな画面が出てきてフォームを埋めていくだけでOKです.
配信先はTwitch/YouTube/Hitbox/Pocarto/Local/Customに対応.多分Customを使えばUstream.tvも行けますね.

20160305_22:03:24-21661

ただ,細かい設定は苦手だったりエラーチェックも甘く配信されないことも多いのでそういう場合にはターミナルから起動して配信(「録画」ボタン)した時の以下のようなログを利用してffmpegで配信するようにするのが良さそうです.

ffmpeg -f x11grab -show_region 0 -s 1366x768 -framerate " 8" -i :0.0+0,0 -f pulse -ac 1 -i  -vcodec h264 -s 798x449 -preset medium -acodec mp3 -ar 44100 -threads 4
-qscale 3 -b:a 128k -b:v 300k -minrate 300k -g 16 -pix_fmt yuv420p -f flv "rtmp://a.rtmp.youtube.com/live2/<_stream_key_>"

設定ファイルは~/.config/castawesome以下に保存されます.keyはYouTubeのものを設定しても.twitch_keyというファイルに保存されていました.

$ ls -A ~/.config/castawesome/
.twitch_key  config.txt

よし,これで配信準備出来たと思ったのですが体調悪くスクリーンセーバーを垂れ流しながら寝落ちしてしまっていましたorz

]]>
https://matoken.org/blog/2016/03/05/try-castawesome-streaming-auxiliary-software/feed/ 0
フレームバッファで焼かれるあひるを録画する(あひる焼き Advent Calendar 2015) https://matoken.org/blog/2015/12/15/recording-a-duck-that-is-baked-in-the-frame-buffer-duck-baked-advent-calendar-2015/ https://matoken.org/blog/2015/12/15/recording-a-duck-that-is-baked-in-the-frame-buffer-duck-baked-advent-calendar-2015/#respond Tue, 15 Dec 2015 10:25:58 +0000 http://matoken.org/blog/?p=1058 この記事は あひる焼き Advent Calendar 2015の12月15日分の記事です.
#2度めですが1週間ほど空きがあったので.


🔥

以前こんな記事を書きました.

この時は

#terminal をフレームバッファも含めて動画でスクリーンショットとる方法が解らず今回は仮想マシンで実行してキャプチャしました.だれか端末のフレームバッファも含めての動画でのスクリーンショットのとり方を知ってる人が居たら教えて下さいo

という感じでフレームバッファの動画の録画方法が解らず,別のカメラで画面を録画していました.調べたら方法が見つかったので今回はその手順を紹介したいと思います.

といっても avconvffmpeg でフレームバッファを指定するだけです.
#Debian stretch からはまた libav から FFmpeg に戻るようです. > libav and FFmpeg: switch over

$ avconv -f fbdev -i /dev/fb0 fb.mp4
$ ffmpeg -f fbdev -i /dev/fb0 fb.mp4

これで録画したのがこちらです.

これで画面をカメラで録画したりしなくても焼かれるあひるが録画できるようになりました :)

]]>
https://matoken.org/blog/2015/12/15/recording-a-duck-that-is-baked-in-the-frame-buffer-duck-baked-advent-calendar-2015/feed/ 0