Created
April 20, 2023 08:35
-
-
Save GenevieveBuckley/72e438539ab03c792d52040ccb9e8f02 to your computer and use it in GitHub Desktop.
Video metadata with ffmpeg and imageio_ffmpeg
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "8438c8ae", | |
"metadata": {}, | |
"source": [ | |
"# ffmpeg metadata" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "65ab8a28", | |
"metadata": {}, | |
"source": [ | |
"Resources:\n", | |
"* http://ffmpeg.org/ffmpeg-formats.html#Metadata-1\n", | |
"* https://write.corbpie.com/adding-metadata-to-a-video-or-audio-file-with-ffmpeg/\n", | |
"* https://gist.github.com/tayvano/6e2d456a9897f55025e25035478a3a50\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "70f135a9", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from imageio_ffmpeg import read_frames, write_frames" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "d1843b51", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"\n", | |
"test_input = \"input.mov\"\n", | |
"assert os.path.exists(test_input)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "341692d0", | |
"metadata": {}, | |
"source": [ | |
"## Read videos" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "1188c2ba", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n", | |
"4\n", | |
"5\n", | |
"6\n", | |
"7\n", | |
"8\n", | |
"9\n", | |
"10\n", | |
"11\n", | |
"12\n", | |
"13\n", | |
"14\n", | |
"15\n", | |
"16\n", | |
"17\n", | |
"18\n", | |
"19\n", | |
"20\n", | |
"21\n", | |
"22\n", | |
"23\n", | |
"24\n", | |
"25\n", | |
"26\n", | |
"27\n", | |
"28\n", | |
"29\n", | |
"30\n", | |
"31\n", | |
"32\n", | |
"33\n", | |
"34\n", | |
"35\n", | |
"36\n", | |
"37\n", | |
"38\n", | |
"39\n", | |
"40\n", | |
"41\n", | |
"42\n", | |
"43\n", | |
"44\n", | |
"45\n", | |
"46\n", | |
"47\n", | |
"48\n", | |
"49\n", | |
"50\n", | |
"51\n", | |
"52\n", | |
"53\n", | |
"54\n", | |
"55\n", | |
"56\n", | |
"57\n", | |
"58\n", | |
"59\n", | |
"60\n", | |
"61\n", | |
"62\n", | |
"63\n", | |
"64\n", | |
"65\n", | |
"66\n", | |
"67\n", | |
"68\n", | |
"69\n", | |
"70\n", | |
"71\n", | |
"72\n", | |
"73\n", | |
"74\n", | |
"75\n", | |
"76\n", | |
"77\n", | |
"78\n", | |
"79\n", | |
"80\n", | |
"81\n", | |
"82\n", | |
"83\n", | |
"84\n", | |
"85\n", | |
"86\n", | |
"87\n", | |
"88\n", | |
"89\n", | |
"90\n", | |
"91\n", | |
"92\n", | |
"93\n", | |
"94\n", | |
"95\n", | |
"96\n", | |
"97\n", | |
"98\n", | |
"99\n", | |
"100\n", | |
"101\n", | |
"102\n", | |
"103\n", | |
"104\n", | |
"105\n", | |
"106\n", | |
"107\n", | |
"108\n", | |
"109\n", | |
"110\n", | |
"111\n", | |
"112\n", | |
"113\n", | |
"114\n", | |
"115\n", | |
"116\n", | |
"117\n", | |
"118\n", | |
"119\n", | |
"120\n", | |
"121\n", | |
"122\n", | |
"123\n", | |
"124\n", | |
"125\n", | |
"126\n", | |
"127\n", | |
"128\n", | |
"129\n", | |
"130\n", | |
"131\n", | |
"132\n", | |
"133\n", | |
"134\n", | |
"135\n", | |
"136\n", | |
"137\n", | |
"138\n", | |
"139\n", | |
"140\n", | |
"141\n", | |
"142\n", | |
"143\n", | |
"144\n", | |
"145\n", | |
"146\n", | |
"147\n", | |
"148\n", | |
"149\n", | |
"150\n", | |
"151\n", | |
"152\n", | |
"153\n", | |
"154\n", | |
"155\n", | |
"156\n", | |
"157\n", | |
"158\n", | |
"159\n", | |
"160\n", | |
"161\n", | |
"162\n", | |
"163\n", | |
"164\n", | |
"165\n" | |
] | |
} | |
], | |
"source": [ | |
"# Read a video file\n", | |
"from imageio_ffmpeg import read_frames\n", | |
"\n", | |
"reader = read_frames(test_input)\n", | |
"meta = reader.__next__() # meta data, e.g. meta[\"size\"] -> (width, height)\n", | |
"for i, frame in enumerate(reader):\n", | |
" print(i) # each frame is a bytes object" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "05a9ad62", | |
"metadata": {}, | |
"source": [ | |
"## Write videos" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"id": "5525c9d1", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"!rm output.mov" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"id": "b3f19852", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (100, 100) to (112, 112) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", | |
"[rawvideo @ 0x159605840] Packet corrupt (stream = 0, dts = 266).\n", | |
"pipe:: corrupt input packet in stream 0\n", | |
"[rawvideo @ 0x159606680] Invalid buffer size, packet size 20000 < expected frame_size 30000\n", | |
"Error while decoding stream #0:0: Invalid argument\n" | |
] | |
} | |
], | |
"source": [ | |
"# Write a video file\n", | |
"from imageio_ffmpeg import write_frames\n", | |
"import numpy as np\n", | |
"\n", | |
"output_path = 'output.mov'\n", | |
"assert not os.path.exists(output_path)\n", | |
"\n", | |
"frames = np.random.random((100,100,100))\n", | |
"size = frames.shape[1:]\n", | |
"\n", | |
"writer = write_frames(output_path, size) # size is (width, height)\n", | |
"writer.send(None) # seed the generator\n", | |
"for frame in frames:\n", | |
" writer.send(frame)\n", | |
"writer.close() # don't forget this" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"id": "22fbef55", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"total 7440\r\n", | |
"drwxr-xr-x 16 genevieb staff 512 20 Apr 16:09 \u001b[34m.\u001b[m\u001b[m\r\n", | |
"drwxr-xr-x 19 genevieb staff 608 20 Apr 15:30 \u001b[34m..\u001b[m\u001b[m\r\n", | |
"-rw-r--r--@ 1 genevieb staff 6148 20 Apr 16:09 .DS_Store\r\n", | |
"drwxr-xr-x 3 genevieb staff 96 20 Apr 16:01 \u001b[34m.ipynb_checkpoints\u001b[m\u001b[m\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 16:04 FFMETADATAFILE\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 15:51 FFMETADATAFILE-demo2d-main-branch\r\n", | |
"-rw-r--r-- 1 genevieb staff 919 12 Jan 21:35 animate2D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 939 12 Jan 21:35 animate3D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1318 12 Jan 21:35 animateMixed.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:29 demo2D_main-branch.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:59 input.mov\r\n", | |
"-rw-r--r--@ 1 genevieb staff 456 12 Jan 21:35 interactive_animation.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1382418 20 Apr 16:09 output.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331491 20 Apr 15:48 output.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381635 20 Apr 15:45 testfile.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 10220 20 Apr 16:09 video-metadata.ipynb\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ls -al" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "86120152", | |
"metadata": {}, | |
"source": [ | |
"## Examine metadata" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"id": "fa16430a", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"!rm FFMETADATAFILE" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"id": "12f0739b", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert not os.path.exists(\"FFMETADATAFILE\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"id": "8f63c3bd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:08.30, start: 0.000000, bitrate: 319 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 316 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i input.mov -f ffmetadata FFMETADATAFILE" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"id": "3cdc3995", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"id": "ed2400e1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mov':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" encoder : Lavf59.27.100\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 665 kb/s\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 664 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\n", | |
" Metadata:\n", | |
" handler_name : VideoHandler\n", | |
" vendor_id : FFMP\n", | |
" encoder : Lavc59.37.100 libx264\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-output-mov':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" encoder : Lavf59.27.100\n", | |
"Stream mapping:\n", | |
"Press [q] to stop, [?] for help\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i output.mov -f ffmetadata FFMETADATAFILE-output-mov" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"id": "26b2de05", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-output-mov" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f8c6b12c", | |
"metadata": {}, | |
"source": [ | |
"## Add metadata" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"id": "1d49d67f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:08.30, start: 0.000000, bitrate: 319 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 316 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, mp4, to 'output-metadata.mp4':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : The video titile\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Stream #0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, q=2-31, 316 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Stream mapping:\r\n", | |
" Stream #0:0 -> #0:0 (copy)\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"frame= 1 fps=0.0 q=-1.0 size= 0kB time=-00:00:00.09 bitrate=N/A speed=N/A \r", | |
"frame= 166 fps=0.0 q=-1.0 Lsize= 324kB time=00:00:08.15 bitrate= 325.4kbits/s speed=8.22e+03x \r\n", | |
"video:321kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.805861%\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i input.mov -metadata title=\"The video titile\" -c copy output-metadata.mp4\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"id": "678add3d", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output-metadata.mp4':\n", | |
" Metadata:\n", | |
" major_brand : isom\n", | |
" minor_version : 512\n", | |
" compatible_brands: isomiso2avc1mp41\n", | |
" title : The video titile\n", | |
" encoder : Lavf59.27.100\n", | |
" Duration: 00:00:08.30, start: 0.000000, bitrate: 319 kb/s\n", | |
" Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 316 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\n", | |
" Metadata:\n", | |
" handler_name : VideoHandler\n", | |
" vendor_id : [0][0][0][0]\n", | |
" encoder : Lavc59.37.100 libx264\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-output-metadata-mp4':\n", | |
" Metadata:\n", | |
" major_brand : isom\n", | |
" minor_version : 512\n", | |
" compatible_brands: isomiso2avc1mp41\n", | |
" title : The video titile\n", | |
" encoder : Lavf59.27.100\n", | |
"Stream mapping:\n", | |
"Press [q] to stop, [?] for help\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i output-metadata.mp4 -f ffmetadata FFMETADATAFILE-output-metadata-mp4\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"id": "7599dffd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=isom\r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=isomiso2avc1mp41\r\n", | |
"title=The video titile\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-output-metadata-mp4" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "7f66b44f", | |
"metadata": {}, | |
"source": [ | |
"### Now add metadata with imageio_ffmpeg" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "87fbf509", | |
"metadata": {}, | |
"source": [ | |
"```python\n", | |
"Signature:\n", | |
"write_frames(\n", | |
" path,\n", | |
" size,\n", | |
" pix_fmt_in='rgb24',\n", | |
" pix_fmt_out='yuv420p',\n", | |
" fps=16,\n", | |
" quality=5,\n", | |
" bitrate=None,\n", | |
" codec=None,\n", | |
" macro_block_size=16,\n", | |
" ffmpeg_log_level='warning',\n", | |
" ffmpeg_timeout=None,\n", | |
" input_params=None,\n", | |
" output_params=None,\n", | |
" audio_path=None,\n", | |
" audio_codec=None,\n", | |
")\n", | |
"Docstring:\n", | |
"Create a generator to write frames (bytes objects) into a video file.\n", | |
"\n", | |
"The frames are written by using the generator's `send()` method. Frames\n", | |
"can be anything that can be written to a file. Typically these are\n", | |
"bytes objects, but c-contiguous Numpy arrays also work.\n", | |
"\n", | |
"Example:\n", | |
"\n", | |
" gen = write_frames(path, size)\n", | |
" gen.send(None) # seed the generator\n", | |
" for frame in frames:\n", | |
" gen.send(frame)\n", | |
" gen.close() # don't forget this\n", | |
"\n", | |
"Parameters:\n", | |
" path (str): the filename to write to.\n", | |
" size (tuple): the width and height of the frames.\n", | |
" pix_fmt_in (str): the pixel format of incoming frames.\n", | |
" E.g. \"gray\", \"gray8a\", \"rgb24\", or \"rgba\". Default \"rgb24\".\n", | |
" pix_fmt_out (str): the pixel format to store frames. Default yuv420p\".\n", | |
" fps (float): The frames per second. Default 16.\n", | |
" quality (float): A measure for quality between 0 and 10. Default 5.\n", | |
" Ignored if bitrate is given.\n", | |
" bitrate (str): The bitrate, e.g. \"192k\". The defaults are pretty good.\n", | |
" codec (str): The codec. Default \"libx264\" for .mp4 (if available from\n", | |
" the ffmpeg executable) or \"msmpeg4\" for .wmv.\n", | |
" macro_block_size (int): You probably want to align the size of frames\n", | |
" to this value to avoid image resizing. Default 16. Can be set\n", | |
" to 1 to avoid block alignment, though this is not recommended.\n", | |
" ffmpeg_log_level (str): The ffmpeg logging level. Default \"warning\".\n", | |
" ffmpeg_timeout (float): Timeout in seconds to wait for ffmpeg process\n", | |
" to finish. Value of 0 or None will wait forever (default). The time that\n", | |
" ffmpeg needs depends on CPU speed, compression, and frame size.\n", | |
" input_params (list): Additional ffmpeg input command line parameters.\n", | |
" output_params (list): Additional ffmpeg output command line parameters.\n", | |
" audio_path (str): A input file path for encoding with an audio stream.\n", | |
" Default None, no audio.\n", | |
" audio_codec (str): The audio codec to use if audio_path is provided.\n", | |
" \"copy\" will try to use audio_path's audio codec without re-encoding.\n", | |
" Default None, but some formats must have certain codecs specified.\n", | |
"File: ~/Documents/GitHub/imageio-ffmpeg/imageio_ffmpeg/_io.py\n", | |
"Type: function\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "c00a10db", | |
"metadata": {}, | |
"source": [ | |
"```python\n", | |
"output_params = ['-metadata title=\"napari\"']\n", | |
"```\n", | |
"\n", | |
"Produces this...\n", | |
"\n", | |
"ERROR\n", | |
"```\n", | |
"FFMPEG COMMAND:\n", | |
"ffmpeg -y -f rawvideo -vcodec rawvideo -s 100x100 -pix_fmt rgb24 -r 16.00 -i - -an -vcodec libx264 -pix_fmt yuv420p -crf 25 -vf scale=112:112 -v warning -metadata title=\"napari\" output-metadata-with-imageio.mov\n", | |
"```\n", | |
" \n", | |
" \n", | |
" \n", | |
"```python\n", | |
"input_params = ['-metadata title=\"napari\"']\n", | |
"```\n", | |
"\n", | |
"Produces this...\n", | |
"\n", | |
"ERROR\n", | |
"```\n", | |
"\n", | |
"FFMPEG COMMAND:\n", | |
"ffmpeg -y -f rawvideo -vcodec rawvideo -s 100x100 -pix_fmt rgb24 -r 16.00 -metadata title=\"napari\" -i - -an -vcodec libx264 -pix_fmt yuv420p -crf 25 -vf scale=112:112 -v warning output-metadata-with-imageio.mov\n", | |
"```\n", | |
"\n", | |
"\n", | |
"Subprocess popen is giving me this...\n", | |
"```\n", | |
"ipdb> print(p.args)\n", | |
"['ffmpeg', '-y', '-f', 'rawvideo', '-vcodec', 'rawvideo', '-s', '100x100', '-pix_fmt', 'rgb24', '-r', '16.00', '-metadata title=\"napari\"', '-i', '-', '-an', '-vcodec', 'libx264', '-pix_fmt', 'yuv420p', '-crf', '25', '-vf', 'scale=112:112', '-v', 'warning', 'output-metadata-with-imageio.mov']\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"id": "557803e1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (100, 100) to (112, 112) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n", | |
"[rawvideo @ 0x135605840] Packet corrupt (stream = 0, dts = 266).\n", | |
"pipe:: corrupt input packet in stream 0\n", | |
"[rawvideo @ 0x135606680] Invalid buffer size, packet size 20000 < expected frame_size 30000\n", | |
"Error while decoding stream #0:0: Invalid argument\n" | |
] | |
} | |
], | |
"source": [ | |
"# Write a video file\n", | |
"from imageio_ffmpeg import write_frames\n", | |
"import numpy as np\n", | |
"\n", | |
"output_path = 'output-metadata-with-imageio.mov'\n", | |
"assert not os.path.exists(output_path)\n", | |
"\n", | |
"frames = np.random.random((100,100,100))\n", | |
"size = frames.shape[1:]\n", | |
"output_params = ['-metadata', 'title=\"napari\"'] # must SEPARATE the '-metadata' string from the key/value metadata string\n", | |
"\n", | |
"writer = write_frames(output_path, size, output_params=output_params) # size is (width, height)\n", | |
"writer.send(None) # seed the generator\n", | |
"for frame in frames:\n", | |
" writer.send(frame)\n", | |
"writer.close() # don't forget this" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"id": "4d4c12cb", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"assert output_path in os.listdir('.')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 43, | |
"id": "f9b992b4", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"total 11000\r\n", | |
"drwxr-xr-x 20 genevieb staff 640 20 Apr 16:40 \u001b[34m.\u001b[m\u001b[m\r\n", | |
"drwxr-xr-x 19 genevieb staff 608 20 Apr 15:30 \u001b[34m..\u001b[m\u001b[m\r\n", | |
"-rw-r--r--@ 1 genevieb staff 6148 20 Apr 16:09 .DS_Store\r\n", | |
"drwxr-xr-x 3 genevieb staff 96 20 Apr 16:01 \u001b[34m.ipynb_checkpoints\u001b[m\u001b[m\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 16:04 FFMETADATAFILE\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 15:51 FFMETADATAFILE-demo2d-main-branch\r\n", | |
"-rw-r--r-- 1 genevieb staff 128 20 Apr 16:13 FFMETADATAFILE-output-metadata-mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 16:10 FFMETADATAFILE-output-mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 919 12 Jan 21:35 animate2D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 939 12 Jan 21:35 animate3D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1318 12 Jan 21:35 animateMixed.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:29 demo2D_main-branch.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:59 input.mov\r\n", | |
"-rw-r--r--@ 1 genevieb staff 456 12 Jan 21:35 interactive_animation.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381746 20 Apr 16:40 output-metadata-with-imageio.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331491 20 Apr 16:13 output-metadata.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1382418 20 Apr 16:09 output.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331491 20 Apr 15:48 output.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381635 20 Apr 15:45 testfile.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 107175 20 Apr 16:35 video-metadata.ipynb\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ls -al" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"id": "2a19f08c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output-metadata-with-imageio.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 664 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 663 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-output-metadata-with-imageio':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i output-metadata-with-imageio.mov -f ffmetadata FFMETADATAFILE-output-metadata-with-imageio\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"id": "a852be29", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-output-metadata-with-imageio" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "384627c9", | |
"metadata": {}, | |
"source": [ | |
"## Test all the file formats" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "5d463bc4", | |
"metadata": {}, | |
"source": [ | |
"### What is the full list of file formats ffmpeg supports?" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 84, | |
"id": "4422e14e", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"File formats:\r\n", | |
" D. = Demuxing supported\r\n", | |
" .E = Muxing supported\r\n", | |
" --\r\n", | |
" D 3dostr 3DO STR\r\n", | |
" E 3g2 3GP2 (3GPP2 file format)\r\n", | |
" E 3gp 3GP (3GPP file format)\r\n", | |
" D 4xm 4X Technologies\r\n", | |
" E a64 a64 - video for Commodore 64\r\n", | |
" D aa Audible AA format files\r\n", | |
" D aac raw ADTS AAC (Advanced Audio Coding)\r\n", | |
" D aax CRI AAX\r\n", | |
" DE ac3 raw AC-3\r\n", | |
" D ace tri-Ace Audio Container\r\n", | |
" D acm Interplay ACM\r\n", | |
" D act ACT Voice file format\r\n", | |
" D adf Artworx Data Format\r\n", | |
" D adp ADP\r\n", | |
" D ads Sony PS2 ADS\r\n", | |
" E adts ADTS AAC (Advanced Audio Coding)\r\n", | |
" DE adx CRI ADX\r\n", | |
" D aea MD STUDIO audio\r\n", | |
" D afc AFC\r\n", | |
" DE aiff Audio IFF\r\n", | |
" D aix CRI AIX\r\n", | |
" DE alaw PCM A-law\r\n", | |
" D alias_pix Alias/Wavefront PIX image\r\n", | |
" DE alp LEGO Racers ALP\r\n", | |
" DE amr 3GPP AMR\r\n", | |
" D amrnb raw AMR-NB\r\n", | |
" D amrwb raw AMR-WB\r\n", | |
" E amv AMV\r\n", | |
" D anm Deluxe Paint Animation\r\n", | |
" D apc CRYO APC\r\n", | |
" D ape Monkey's Audio\r\n", | |
" DE apm Ubisoft Rayman 2 APM\r\n", | |
" DE apng Animated Portable Network Graphics\r\n", | |
" DE aptx raw aptX (Audio Processing Technology for Bluetooth)\r\n", | |
" DE aptx_hd raw aptX HD (Audio Processing Technology for Bluetooth)\r\n", | |
" D aqtitle AQTitle subtitles\r\n", | |
" DE argo_asf Argonaut Games ASF\r\n", | |
" D argo_brp Argonaut Games BRP\r\n", | |
" DE argo_cvg Argonaut Games CVG\r\n", | |
" DE asf ASF (Advanced / Active Streaming Format)\r\n", | |
" D asf_o ASF (Advanced / Active Streaming Format)\r\n", | |
" E asf_stream ASF (Advanced / Active Streaming Format)\r\n", | |
" DE ass SSA (SubStation Alpha) subtitle\r\n", | |
" DE ast AST (Audio Stream)\r\n", | |
" DE au Sun AU\r\n", | |
" E audiotoolbox AudioToolbox output device\r\n", | |
" D av1 AV1 Annex B\r\n", | |
" D avfoundation AVFoundation input device\r\n", | |
" DE avi AVI (Audio Video Interleaved)\r\n", | |
" E avif AVIF\r\n", | |
" E avm2 SWF (ShockWave Flash) (AVM2)\r\n", | |
" D avr AVR (Audio Visual Research)\r\n", | |
" D avs Argonaut Games Creature Shock\r\n", | |
" DE avs2 raw AVS2-P2/IEEE1857.4 video\r\n", | |
" DE avs3 AVS3-P2/IEEE1857.10\r\n", | |
" D bethsoftvid Bethesda Softworks VID\r\n", | |
" D bfi Brute Force & Ignorance\r\n", | |
" D bfstm BFSTM (Binary Cafe Stream)\r\n", | |
" D bin Binary text\r\n", | |
" D bink Bink\r\n", | |
" D binka Bink Audio\r\n", | |
" DE bit G.729 BIT file format\r\n", | |
" D bitpacked Bitpacked\r\n", | |
" D bmp_pipe piped bmp sequence\r\n", | |
" D bmv Discworld II BMV\r\n", | |
" D boa Black Ops Audio\r\n", | |
" D brender_pix BRender PIX image\r\n", | |
" D brstm BRSTM (Binary Revolution Stream)\r\n", | |
" D c93 Interplay C93\r\n", | |
" DE caf Apple CAF (Core Audio Format)\r\n", | |
" DE cavsvideo raw Chinese AVS (Audio Video Standard) video\r\n", | |
" D cdg CD Graphics\r\n", | |
" D cdxl Commodore CDXL video\r\n", | |
" D cine Phantom Cine\r\n", | |
" DE codec2 codec2 .c2 muxer\r\n", | |
" DE codec2raw raw codec2 muxer\r\n", | |
" D concat Virtual concatenation script\r\n", | |
" E crc CRC testing\r\n", | |
" D cri_pipe piped cri sequence\r\n", | |
" DE dash DASH Muxer\r\n", | |
" DE data raw data\r\n", | |
" DE daud D-Cinema audio\r\n", | |
" D dcstr Sega DC STR\r\n", | |
" D dds_pipe piped dds sequence\r\n", | |
" D derf Xilam DERF\r\n", | |
" D dfa Chronomaster DFA\r\n", | |
" DE dfpwm raw DFPWM1a\r\n", | |
" D dhav Video DAV\r\n", | |
" DE dirac raw Dirac\r\n", | |
" DE dnxhd raw DNxHD (SMPTE VC-3)\r\n", | |
" D dpx_pipe piped dpx sequence\r\n", | |
" D dsf DSD Stream File (DSF)\r\n", | |
" D dsicin Delphine Software International CIN\r\n", | |
" D dss Digital Speech Standard (DSS)\r\n", | |
" DE dts raw DTS\r\n", | |
" D dtshd raw DTS-HD\r\n", | |
" DE dv DV (Digital Video)\r\n", | |
" D dvbsub raw dvbsub\r\n", | |
" D dvbtxt dvbtxt\r\n", | |
" E dvd MPEG-2 PS (DVD VOB)\r\n", | |
" D dxa DXA\r\n", | |
" D ea Electronic Arts Multimedia\r\n", | |
" D ea_cdata Electronic Arts cdata\r\n", | |
" DE eac3 raw E-AC-3\r\n", | |
" D epaf Ensoniq Paris Audio File\r\n", | |
" D exr_pipe piped exr sequence\r\n", | |
" DE f32be PCM 32-bit floating-point big-endian\r\n", | |
" DE f32le PCM 32-bit floating-point little-endian\r\n", | |
" E f4v F4V Adobe Flash Video\r\n", | |
" DE f64be PCM 64-bit floating-point big-endian\r\n", | |
" DE f64le PCM 64-bit floating-point little-endian\r\n", | |
" DE ffmetadata FFmpeg metadata in text\r\n", | |
" E fifo FIFO queue pseudo-muxer\r\n", | |
" E fifo_test Fifo test muxer\r\n", | |
" DE film_cpk Sega FILM / CPK\r\n", | |
" DE filmstrip Adobe Filmstrip\r\n", | |
" DE fits Flexible Image Transport System\r\n", | |
" DE flac raw FLAC\r\n", | |
" D flic FLI/FLC/FLX animation\r\n", | |
" DE flv FLV (Flash Video)\r\n", | |
" E framecrc framecrc testing\r\n", | |
" E framehash Per-frame hash testing\r\n", | |
" E framemd5 Per-frame MD5 testing\r\n", | |
" D frm Megalux Frame\r\n", | |
" D fsb FMOD Sample Bank\r\n", | |
" D fwse Capcom's MT Framework sound\r\n", | |
" DE g722 raw G.722\r\n", | |
" DE g723_1 raw G.723.1\r\n", | |
" DE g726 raw big-endian G.726 (\"left-justified\")\r\n", | |
" DE g726le raw little-endian G.726 (\"right-justified\")\r\n", | |
" D g729 G.729 raw format demuxer\r\n", | |
" D gdv Gremlin Digital Video\r\n", | |
" D gem_pipe piped gem sequence\r\n", | |
" D genh GENeric Header\r\n", | |
" DE gif CompuServe Graphics Interchange Format (GIF)\r\n", | |
" D gif_pipe piped gif sequence\r\n", | |
" DE gsm raw GSM\r\n", | |
" DE gxf GXF (General eXchange Format)\r\n", | |
" DE h261 raw H.261\r\n", | |
" DE h263 raw H.263\r\n", | |
" DE h264 raw H.264 video\r\n", | |
" E hash Hash testing\r\n", | |
" D hca CRI HCA\r\n", | |
" D hcom Macintosh HCOM\r\n", | |
" E hds HDS Muxer\r\n", | |
" DE hevc raw HEVC video\r\n", | |
" DE hls Apple HTTP Live Streaming\r\n", | |
" D hnm Cryo HNM v4\r\n", | |
" DE ico Microsoft Windows ICO\r\n", | |
" D idcin id Cinematic\r\n", | |
" D idf iCE Draw File\r\n", | |
" D iff IFF (Interchange File Format)\r\n", | |
" D ifv IFV CCTV DVR\r\n", | |
" DE ilbc iLBC storage\r\n", | |
" DE image2 image2 sequence\r\n", | |
" DE image2pipe piped image2 sequence\r\n", | |
" D imf IMF (Interoperable Master Format)\r\n", | |
" D ingenient raw Ingenient MJPEG\r\n", | |
" D ipmovie Interplay MVE\r\n", | |
" E ipod iPod H.264 MP4 (MPEG-4 Part 14)\r\n", | |
" D ipu raw IPU Video\r\n", | |
" DE ircam Berkeley/IRCAM/CARL Sound Format\r\n", | |
" E ismv ISMV/ISMA (Smooth Streaming)\r\n", | |
" D iss Funcom ISS\r\n", | |
" D iv8 IndigoVision 8000 video\r\n", | |
" DE ivf On2 IVF\r\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" D ivr IVR (Internet Video Recording)\r\n", | |
" D j2k_pipe piped j2k sequence\r\n", | |
" DE jacosub JACOsub subtitle format\r\n", | |
" D jpeg_pipe piped jpeg sequence\r\n", | |
" D jpegls_pipe piped jpegls sequence\r\n", | |
" D jpegxl_pipe piped jpegxl sequence\r\n", | |
" D jv Bitmap Brothers JV\r\n", | |
" D kux KUX (YouKu)\r\n", | |
" DE kvag Simon & Schuster Interactive VAG\r\n", | |
" E latm LOAS/LATM\r\n", | |
" D lavfi Libavfilter virtual input device\r\n", | |
" D live_flv live RTMP FLV (Flash Video)\r\n", | |
" D lmlm4 raw lmlm4\r\n", | |
" D loas LOAS AudioSyncStream\r\n", | |
" DE lrc LRC lyrics\r\n", | |
" D luodat Video CCTV DAT\r\n", | |
" D lvf LVF\r\n", | |
" D lxf VR native stream (LXF)\r\n", | |
" DE m4v raw MPEG-4 video\r\n", | |
" E matroska Matroska\r\n", | |
" D matroska,webm Matroska / WebM\r\n", | |
" D mca MCA Audio Format\r\n", | |
" D mcc MacCaption\r\n", | |
" E md5 MD5 testing\r\n", | |
" D mgsts Metal Gear Solid: The Twin Snakes\r\n", | |
" DE microdvd MicroDVD subtitle format\r\n", | |
" DE mjpeg raw MJPEG video\r\n", | |
" D mjpeg_2000 raw MJPEG 2000 video\r\n", | |
" E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix\r\n", | |
" DE mlp raw MLP\r\n", | |
" D mlv Magic Lantern Video (MLV)\r\n", | |
" D mm American Laser Games MM\r\n", | |
" DE mmf Yamaha SMAF\r\n", | |
" D mods MobiClip MODS\r\n", | |
" D moflex MobiClip MOFLEX\r\n", | |
" E mov QuickTime / MOV\r\n", | |
" D mov,mp4,m4a,3gp,3g2,mj2 QuickTime / MOV\r\n", | |
" E mp2 MP2 (MPEG audio layer 2)\r\n", | |
" DE mp3 MP3 (MPEG audio layer 3)\r\n", | |
" E mp4 MP4 (MPEG-4 Part 14)\r\n", | |
" D mpc Musepack\r\n", | |
" D mpc8 Musepack SV8\r\n", | |
" DE mpeg MPEG-1 Systems / MPEG program stream\r\n", | |
" E mpeg1video raw MPEG-1 video\r\n", | |
" E mpeg2video raw MPEG-2 video\r\n", | |
" DE mpegts MPEG-TS (MPEG-2 Transport Stream)\r\n", | |
" D mpegtsraw raw MPEG-TS (MPEG-2 Transport Stream)\r\n", | |
" D mpegvideo raw MPEG video\r\n", | |
" DE mpjpeg MIME multipart JPEG\r\n", | |
" D mpl2 MPL2 subtitles\r\n", | |
" D mpsub MPlayer subtitles\r\n", | |
" D msf Sony PS3 MSF\r\n", | |
" D msnwctcp MSN TCP Webcam stream\r\n", | |
" D msp Microsoft Paint (MSP))\r\n", | |
" D mtaf Konami PS2 MTAF\r\n", | |
" D mtv MTV\r\n", | |
" DE mulaw PCM mu-law\r\n", | |
" D musx Eurocom MUSX\r\n", | |
" D mv Silicon Graphics Movie\r\n", | |
" D mvi Motion Pixels MVI\r\n", | |
" DE mxf MXF (Material eXchange Format)\r\n", | |
" E mxf_d10 MXF (Material eXchange Format) D-10 Mapping\r\n", | |
" E mxf_opatom MXF (Material eXchange Format) Operational Pattern Atom\r\n", | |
" D mxg MxPEG clip\r\n", | |
" D nc NC camera feed\r\n", | |
" D nistsphere NIST SPeech HEader REsources\r\n", | |
" D nsp Computerized Speech Lab NSP\r\n", | |
" D nsv Nullsoft Streaming Video\r\n", | |
" E null raw null video\r\n", | |
" DE nut NUT\r\n", | |
" D nuv NuppelVideo\r\n", | |
" DE obu AV1 low overhead OBU\r\n", | |
" E oga Ogg Audio\r\n", | |
" DE ogg Ogg\r\n", | |
" E ogv Ogg Video\r\n", | |
" DE oma Sony OpenMG audio\r\n", | |
" E opus Ogg Opus\r\n", | |
" D paf Amazing Studio Packed Animation File\r\n", | |
" D pam_pipe piped pam sequence\r\n", | |
" D pbm_pipe piped pbm sequence\r\n", | |
" D pcx_pipe piped pcx sequence\r\n", | |
" D pfm_pipe piped pfm sequence\r\n", | |
" D pgm_pipe piped pgm sequence\r\n", | |
" D pgmyuv_pipe piped pgmyuv sequence\r\n", | |
" D pgx_pipe piped pgx sequence\r\n", | |
" D phm_pipe piped phm sequence\r\n", | |
" D photocd_pipe piped photocd sequence\r\n", | |
" D pictor_pipe piped pictor sequence\r\n", | |
" D pjs PJS (Phoenix Japanimation Society) subtitles\r\n", | |
" D pmp Playstation Portable PMP\r\n", | |
" D png_pipe piped png sequence\r\n", | |
" D pp_bnk Pro Pinball Series Soundbank\r\n", | |
" D ppm_pipe piped ppm sequence\r\n", | |
" D psd_pipe piped psd sequence\r\n", | |
" E psp PSP MP4 (MPEG-4 Part 14)\r\n", | |
" D psxstr Sony Playstation STR\r\n", | |
" D pva TechnoTrend PVA\r\n", | |
" D pvf PVF (Portable Voice Format)\r\n", | |
" D qcp QCP\r\n", | |
" D qdraw_pipe piped qdraw sequence\r\n", | |
" D qoi_pipe piped qoi sequence\r\n", | |
" D r3d REDCODE R3D\r\n", | |
" DE rawvideo raw video\r\n", | |
" D realtext RealText subtitle format\r\n", | |
" D redspark RedSpark\r\n", | |
" D rl2 RL2\r\n", | |
" DE rm RealMedia\r\n", | |
" DE roq raw id RoQ\r\n", | |
" D rpl RPL / ARMovie\r\n", | |
" D rsd GameCube RSD\r\n", | |
" DE rso Lego Mindstorms RSO\r\n", | |
" DE rtp RTP output\r\n", | |
" E rtp_mpegts RTP/mpegts output format\r\n", | |
" DE rtsp RTSP output\r\n", | |
" DE s16be PCM signed 16-bit big-endian\r\n", | |
" DE s16le PCM signed 16-bit little-endian\r\n", | |
" DE s24be PCM signed 24-bit big-endian\r\n", | |
" DE s24le PCM signed 24-bit little-endian\r\n", | |
" DE s32be PCM signed 32-bit big-endian\r\n", | |
" DE s32le PCM signed 32-bit little-endian\r\n", | |
" D s337m SMPTE 337M\r\n", | |
" DE s8 PCM signed 8-bit\r\n", | |
" D sami SAMI subtitle format\r\n", | |
" DE sap SAP output\r\n", | |
" DE sbc raw SBC\r\n", | |
" D sbg SBaGen binaural beats script\r\n", | |
" DE scc Scenarist Closed Captions\r\n", | |
" D scd Square Enix SCD\r\n", | |
" E sdl,sdl2 SDL2 output device\r\n", | |
" D sdp SDP\r\n", | |
" D sdr2 SDR2\r\n", | |
" D sds MIDI Sample Dump Standard\r\n", | |
" D sdx Sample Dump eXchange\r\n", | |
" E segment segment\r\n", | |
" D ser SER (Simple uncompressed video format for astronomical capturing)\r\n", | |
" D sga Digital Pictures SGA\r\n", | |
" D sgi_pipe piped sgi sequence\r\n", | |
" D shn raw Shorten\r\n", | |
" D siff Beam Software SIFF\r\n", | |
" D simbiosis_imx Simbiosis Interactive IMX\r\n", | |
" D sln Asterisk raw pcm\r\n", | |
" DE smjpeg Loki SDL MJPEG\r\n", | |
" D smk Smacker\r\n", | |
" E smoothstreaming Smooth Streaming Muxer\r\n", | |
" D smush LucasArts Smush\r\n", | |
" D sol Sierra SOL\r\n", | |
" DE sox SoX native\r\n", | |
" DE spdif IEC 61937 (used on S/PDIF - IEC958)\r\n", | |
" E spx Ogg Speex\r\n", | |
" DE srt SubRip subtitle\r\n", | |
" D stl Spruce subtitle format\r\n", | |
" E stream_segment,ssegment streaming segment muxer\r\n", | |
" E streamhash Per-stream hash testing\r\n", | |
" D subviewer SubViewer subtitle format\r\n", | |
" D subviewer1 SubViewer v1 subtitle format\r\n", | |
" D sunrast_pipe piped sunrast sequence\r\n", | |
" DE sup raw HDMV Presentation Graphic Stream subtitles\r\n", | |
" D svag Konami PS2 SVAG\r\n", | |
" E svcd MPEG-2 PS (SVCD)\r\n", | |
" D svg_pipe piped svg sequence\r\n", | |
" D svs Square SVS\r\n", | |
" DE swf SWF (ShockWave Flash)\r\n", | |
" D tak raw TAK\r\n", | |
" D tedcaptions TED Talks captions\r\n", | |
" E tee Multiple muxer tee\r\n", | |
" D thp THP\r\n", | |
" D tiertexseq Tiertex Limited SEQ\r\n", | |
" D tiff_pipe piped tiff sequence\r\n", | |
" D tmv 8088flex TMV\r\n", | |
" DE truehd raw TrueHD\r\n", | |
" DE tta TTA (True Audio)\r\n", | |
" E ttml TTML subtitle\r\n", | |
" D tty Tele-typewriter\r\n", | |
" D txd Renderware TeXture Dictionary\r\n", | |
" D ty TiVo TY Stream\r\n", | |
" DE u16be PCM unsigned 16-bit big-endian\r\n", | |
" DE u16le PCM unsigned 16-bit little-endian\r\n", | |
" DE u24be PCM unsigned 24-bit big-endian\r\n", | |
" DE u24le PCM unsigned 24-bit little-endian\r\n", | |
" DE u32be PCM unsigned 32-bit big-endian\r\n", | |
" DE u32le PCM unsigned 32-bit little-endian\r\n", | |
" DE u8 PCM unsigned 8-bit\r\n", | |
" E uncodedframecrc uncoded framecrc testing\r\n", | |
" D v210 Uncompressed 4:2:2 10-bit\r\n", | |
" D v210x Uncompressed 4:2:2 10-bit\r\n", | |
" D vag Sony PS2 VAG\r\n", | |
" D vbn_pipe piped vbn sequence\r\n", | |
" DE vc1 raw VC-1 video\r\n", | |
" DE vc1test VC-1 test bitstream\r\n", | |
" E vcd MPEG-1 Systems / MPEG program stream (VCD)\r\n", | |
" DE vidc PCM Archimedes VIDC\r\n", | |
" D vividas Vividas VIV\r\n", | |
" D vivo Vivo\r\n", | |
" D vmd Sierra VMD\r\n", | |
" E vob MPEG-2 PS (VOB)\r\n", | |
" D vobsub VobSub subtitle format\r\n", | |
" DE voc Creative Voice\r\n", | |
" D vpk Sony PS2 VPK\r\n", | |
" D vplayer VPlayer subtitles\r\n", | |
" D vqf Nippon Telegraph and Telephone Corporation (NTT) TwinVQ\r\n", | |
" DE w64 Sony Wave64\r\n", | |
" DE wav WAV / WAVE (Waveform Audio)\r\n", | |
" D wc3movie Wing Commander III movie\r\n", | |
" E webm WebM\r\n", | |
" E webm_chunk WebM Chunk Muxer\r\n", | |
" DE webm_dash_manifest WebM DASH Manifest\r\n", | |
" E webp WebP\r\n", | |
" D webp_pipe piped webp sequence\r\n", | |
" DE webvtt WebVTT subtitle\r\n", | |
" DE wsaud Westwood Studios audio\r\n", | |
" D wsd Wideband Single-bit Data (WSD)\r\n", | |
" D wsvqa Westwood Studios VQA\r\n", | |
" DE wtv Windows Television (WTV)\r\n", | |
" DE wv raw WavPack\r\n", | |
" D wve Psion 3 audio\r\n", | |
" D x11grab X11 screen capture, using XCB\r\n", | |
" D xa Maxis XA\r\n", | |
" D xbin eXtended BINary text (XBIN)\r\n", | |
" D xbm_pipe piped xbm sequence\r\n", | |
" D xmv Microsoft XMV\r\n", | |
" D xpm_pipe piped xpm sequence\r\n", | |
" D xvag Sony PS3 XVAG\r\n", | |
" D xwd_pipe piped xwd sequence\r\n", | |
" D xwma Microsoft xWMA\r\n", | |
" D yop Psygnosis YOP\r\n", | |
" DE yuv4mpegpipe YUV4MPEG pipe\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -formats" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "dfeaa182", | |
"metadata": {}, | |
"source": [ | |
"### Just guess most common video extensions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 59, | |
"id": "4a295fcd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (100, 100) to (112, 112) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"test-description.mov\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"[rawvideo @ 0x15ae05840] Packet corrupt (stream = 0, dts = 266).\n", | |
"pipe:: corrupt input packet in stream 0\n", | |
"[rawvideo @ 0x15ae06680] Invalid buffer size, packet size 20000 < expected frame_size 30000\n", | |
"Error while decoding stream #0:0: Invalid argument\n", | |
"IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (100, 100) to (112, 112) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"test-description.mp4\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"[rawvideo @ 0x129e05840] Packet corrupt (stream = 0, dts = 266).\n", | |
"pipe:: corrupt input packet in stream 0\n", | |
"[rawvideo @ 0x129e06680] Invalid buffer size, packet size 20000 < expected frame_size 30000\n", | |
"Error while decoding stream #0:0: Invalid argument\n", | |
"IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (100, 100) to (112, 112) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"test-description.avi\n" | |
] | |
}, | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"[rawvideo @ 0x11de05840] Packet corrupt (stream = 0, dts = 266).\n", | |
"pipe:: corrupt input packet in stream 0\n", | |
"[rawvideo @ 0x11de06680] Invalid buffer size, packet size 20000 < expected frame_size 30000\n", | |
"Error while decoding stream #0:0: Invalid argument\n" | |
] | |
} | |
], | |
"source": [ | |
"# Write a video file\n", | |
"from imageio_ffmpeg import write_frames\n", | |
"import numpy as np\n", | |
"\n", | |
"extensions = ['.mov', '.mp4', '.avi']\n", | |
"# '.webm' - Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument\n", | |
"# '.gif' - Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument\n", | |
"# '.mp3' - Output file #0 does not contain any stream\n", | |
"\n", | |
"for ext in extensions:\n", | |
" output_path = 'test-description'+ext\n", | |
" print(output_path)\n", | |
" assert not os.path.exists(output_path)\n", | |
"\n", | |
" frames = np.random.random((100,100,100))\n", | |
" size = frames.shape[1:]\n", | |
" output_params = ['-metadata', 'title=\"napari version x.y.z\"',\n", | |
" '-metadata', 'description=\"A great description goes here!\"'] # must SEPARATE the '-metadata' string from the key/value metadata string\n", | |
" writer = write_frames(output_path, size, output_params=output_params) # size is (width, height)\n", | |
" writer.send(None) # seed the generator\n", | |
" for frame in frames:\n", | |
" writer.send(frame)\n", | |
" writer.close() # don't forget this" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 61, | |
"id": "1e7a1c96", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-rw-r--r-- 1 genevieb staff 1388818 20 Apr 17:01 test-description.avi\r\n", | |
"-rw-r--r-- 1 genevieb staff 1379051 20 Apr 17:01 test-description.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 1376687 20 Apr 17:01 test-description.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1390224 20 Apr 17:00 test.avi\r\n", | |
"-rw-r--r-- 1 genevieb staff 0 20 Apr 17:00 test.gif\r\n", | |
"-rw-r--r-- 1 genevieb staff 1379555 20 Apr 16:58 test.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 1379903 20 Apr 16:58 test.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 289 20 Apr 16:58 test.webm\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381635 20 Apr 15:45 testfile.mov\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ls -al | grep test" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 62, | |
"id": "6247dd4a", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"Input #0, avi, from 'test.avi':\n", | |
" Metadata:\n", | |
" title : \"napari version x.y.z\"\n", | |
" software : Lavf59.27.100\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 668 kb/s\n", | |
" Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 112x112, 665 kb/s, 16 fps, 16 tbr, 16 tbn\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-avi':\n", | |
" Metadata:\n", | |
" title : \"napari version x.y.z\"\n", | |
" software : Lavf59.27.100\n", | |
" encoder : Lavf59.27.100\n", | |
"Stream mapping:\n", | |
"Press [q] to stop, [?] for help\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test.avi -f ffmetadata FFMETADATAFILE-test-avi" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 63, | |
"id": "9f1ce2eb", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 663 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 662 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test.mov -f ffmetadata FFMETADATAFILE-test-mov" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 64, | |
"id": "df0f19d3", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':\r\n", | |
" Metadata:\r\n", | |
" major_brand : isom\r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: isomiso2avc1mp41\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 664 kb/s\r\n", | |
" Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 663 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : [0][0][0][0]\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-mp4':\r\n", | |
" Metadata:\r\n", | |
" major_brand : isom\r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: isomiso2avc1mp41\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test.mp4 -f ffmetadata FFMETADATAFILE-test-mp4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "0a215218", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"id": "7339763b", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, avi, from 'test-description.avi':\r\n", | |
" Metadata:\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" software : Lavf59.27.100\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 668 kb/s\r\n", | |
" Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 112x112, 664 kb/s, 16 fps, 16 tbr, 16 tbn\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-avi-description':\r\n", | |
" Metadata:\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" software : Lavf59.27.100\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test-description.avi -f ffmetadata FFMETADATAFILE-test-avi-description" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 66, | |
"id": "33513edc", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test-description.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 663 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 662 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-mov-description':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test-description.mov -f ffmetadata FFMETADATAFILE-test-mov-description" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 67, | |
"id": "a9401aac", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test-description.mp4':\r\n", | |
" Metadata:\r\n", | |
" major_brand : isom\r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: isomiso2avc1mp41\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" description : \"A great description goes here!\"\r\n", | |
" Duration: 00:00:16.63, start: 0.000000, bitrate: 662 kb/s\r\n", | |
" Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 112x112, 661 kb/s, 16 fps, 16 tbr, 16384 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : [0][0][0][0]\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-test-mp4-description':\r\n", | |
" Metadata:\r\n", | |
" major_brand : isom\r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: isomiso2avc1mp41\r\n", | |
" title : \"napari version x.y.z\"\r\n", | |
" description : \"A great description goes here!\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test-description.mp4 -f ffmetadata FFMETADATAFILE-test-mp4-description" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "06ce07bf", | |
"metadata": {}, | |
"source": [ | |
"### Kinda broken ones, didn't write correctly" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"id": "929d4810", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"\u001b[1;31mtest.gif: Invalid data found when processing input\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test.gif -f ffmetadata FFMETADATAFILE-test-gif" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 69, | |
"id": "bf2a4a56", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"\u001b[1;31mtest.webm: End of file\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i test.webm -f ffmetadata FFMETADATAFILE-test-webm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "88347c19", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ce34149c", | |
"metadata": {}, | |
"source": [ | |
"## Read the metadata" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ebfbc459", | |
"metadata": {}, | |
"source": [ | |
"### .avi format" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 71, | |
"id": "4c9bf9d0", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"software=Lavf59.27.100\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-test-avi" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 72, | |
"id": "274a8210", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"software=Lavf59.27.100\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"# no description metadata key in output :(\n", | |
"!cat FFMETADATAFILE-test-avi-description" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "8494814b", | |
"metadata": {}, | |
"source": [ | |
"### .mov format" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 74, | |
"id": "df7fd6d3", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-test-mov" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 75, | |
"id": "a6b3e74b", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"# no description metadata key in output :(\n", | |
"!cat FFMETADATAFILE-test-mov-description" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d3cc09f9", | |
"metadata": {}, | |
"source": [ | |
"### .mp4 format" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 76, | |
"id": "0d50692f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=isom\r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=isomiso2avc1mp41\r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-test-mp4" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"id": "eb89195c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=isom\r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=isomiso2avc1mp41\r\n", | |
"title=\"napari version x.y.z\"\r\n", | |
"description=\"A great description goes here!\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"# mp4 seems to be the only one that does have a description metadata key in the output\n", | |
"!cat FFMETADATAFILE-test-mp4-description" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "88c0ff83", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "87a9e9eb", | |
"metadata": {}, | |
"source": [ | |
"## Check output from code branch" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 78, | |
"id": "8c1ecf77", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo2d.mov':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\n", | |
" encoder : Lavf59.27.100\n", | |
" Duration: 00:00:08.30, start: 0.000000, bitrate: 330 kb/s\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 327 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\n", | |
" Metadata:\n", | |
" handler_name : VideoHandler\n", | |
" vendor_id : FFMP\n", | |
" encoder : Lavc59.37.100 libx264\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-demo2d':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\n", | |
" encoder : Lavf59.27.100\n", | |
"Stream mapping:\n", | |
"Press [q] to stop, [?] for help\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i demo2d.mov -f ffmetadata FFMETADATAFILE-demo2d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 79, | |
"id": "a6e109c1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\r\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\r\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\r\n", | |
" libavutil 57. 28.100 / 57. 28.100\r\n", | |
" libavcodec 59. 37.100 / 59. 37.100\r\n", | |
" libavformat 59. 27.100 / 59. 27.100\r\n", | |
" libavdevice 59. 7.100 / 59. 7.100\r\n", | |
" libavfilter 8. 44.100 / 8. 44.100\r\n", | |
" libswscale 6. 7.100 / 6. 7.100\r\n", | |
" libswresample 4. 7.100 / 4. 7.100\r\n", | |
" libpostproc 56. 6.100 / 56. 6.100\r\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demo3d.mov':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
" Duration: 00:00:07.55, start: 0.000000, bitrate: 4857 kb/s\r\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 4854 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\r\n", | |
" Metadata:\r\n", | |
" handler_name : VideoHandler\r\n", | |
" vendor_id : FFMP\r\n", | |
" encoder : Lavc59.37.100 libx264\r\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-demo3d':\r\n", | |
" Metadata:\r\n", | |
" major_brand : qt \r\n", | |
" minor_version : 512\r\n", | |
" compatible_brands: qt \r\n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\r\n", | |
" encoder : Lavf59.27.100\r\n", | |
"Stream mapping:\r\n", | |
"Press [q] to stop, [?] for help\r\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \r\n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\r\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\r\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i demo3d.mov -f ffmetadata FFMETADATAFILE-demo3d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 80, | |
"id": "fccae4d0", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers\n", | |
" built with Apple clang version 14.0.0 (clang-1400.0.29.202)\n", | |
" configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1.2_4 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon\n", | |
" libavutil 57. 28.100 / 57. 28.100\n", | |
" libavcodec 59. 37.100 / 59. 37.100\n", | |
" libavformat 59. 27.100 / 59. 27.100\n", | |
" libavdevice 59. 7.100 / 59. 7.100\n", | |
" libavfilter 8. 44.100 / 8. 44.100\n", | |
" libswscale 6. 7.100 / 6. 7.100\n", | |
" libswresample 4. 7.100 / 4. 7.100\n", | |
" libpostproc 56. 6.100 / 56. 6.100\n", | |
"Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'demoMixed.mov':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\n", | |
" encoder : Lavf59.27.100\n", | |
" Duration: 00:00:16.55, start: 0.000000, bitrate: 2357 kb/s\n", | |
" Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 2720x1696, 2354 kb/s, 20 fps, 20 tbr, 10240 tbn (default)\n", | |
" Metadata:\n", | |
" handler_name : VideoHandler\n", | |
" vendor_id : FFMP\n", | |
" encoder : Lavc59.37.100 libx264\n", | |
"Output #0, ffmetadata, to 'FFMETADATAFILE-demoMixed':\n", | |
" Metadata:\n", | |
" major_brand : qt \n", | |
" minor_version : 512\n", | |
" compatible_brands: qt \n", | |
" title : \"napari version 0.4.17 https://napari.org/\"\n", | |
" encoder : Lavf59.27.100\n", | |
"Stream mapping:\n", | |
"Press [q] to stop, [?] for help\n", | |
"size= 0kB time=-577014:32:22.77 bitrate=N/A speed=N/A \n", | |
"video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown\n", | |
"\u001b[0;33mOutput file is empty, nothing was encoded \u001b[0m\u001b[0;33m\n", | |
"\u001b[0m" | |
] | |
} | |
], | |
"source": [ | |
"!ffmpeg -i demoMixed.mov -f ffmetadata FFMETADATAFILE-demoMixed" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 81, | |
"id": "6faf57e0", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari version 0.4.17 https://napari.org/\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-demo2d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 82, | |
"id": "60e8f514", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari version 0.4.17 https://napari.org/\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-demo3d" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 83, | |
"id": "fb05800f", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
";FFMETADATA1\r\n", | |
"major_brand=qt \r\n", | |
"minor_version=512\r\n", | |
"compatible_brands=qt \r\n", | |
"title=\"napari version 0.4.17 https://napari.org/\"\r\n", | |
"encoder=Lavf59.27.100\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cat FFMETADATAFILE-demoMixed" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d1e531ae", | |
"metadata": {}, | |
"source": [ | |
"## Debugging" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "b036b3e4", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"test.webm\n", | |
"\n", | |
"[webm @ 0x141e06de0] Only VP8 or VP9 or AV1 video and Vorbis or Opus audio and WebVTT subtitles are supported for WebM.\n", | |
"Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument\n", | |
"Error initializing output stream 0:0 -- \n", | |
"\n", | |
"---------------------------------------------------------------------------\n", | |
"BrokenPipeError Traceback (most recent call last)\n", | |
"File ~/Documents/GitHub/imageio-ffmpeg/imageio_ffmpeg/_io.py:630, in write_frames(path, size, pix_fmt_in, pix_fmt_out, fps, quality, bitrate, codec, macro_block_size, ffmpeg_log_level, ffmpeg_timeout, input_params, output_params, audio_path, audio_codec)\n", | |
" 629 try:\n", | |
"--> 630 p.stdin.write(bb)\n", | |
" 631 except Exception as err:\n", | |
" 632 # Show the command and stderr from pipe\n", | |
"\n", | |
"BrokenPipeError: [Errno 32] Broken pipe\n", | |
"\n", | |
"During handling of the above exception, another exception occurred:\n", | |
"\n", | |
"OSError Traceback (most recent call last)\n", | |
"Cell In[56], line 18\n", | |
" 16 writer.send(None) # seed the generator\n", | |
" 17 for frame in frames:\n", | |
"---> 18 writer.send(frame)\n", | |
" 19 writer.close() # don't forget this\n", | |
"\n", | |
"File ~/Documents/GitHub/imageio-ffmpeg/imageio_ffmpeg/_io.py:637, in write_frames(path, size, pix_fmt_in, pix_fmt_out, fps, quality, bitrate, codec, macro_block_size, ffmpeg_log_level, ffmpeg_timeout, input_params, output_params, audio_path, audio_codec)\n", | |
" 631 except Exception as err:\n", | |
" 632 # Show the command and stderr from pipe\n", | |
" 633 msg = (\n", | |
" 634 \"{0:}\\n\\nFFMPEG COMMAND:\\n{1:}\\n\\nFFMPEG STDERR \"\n", | |
" 635 \"OUTPUT:\\n\".format(err, cmd_str)\n", | |
" 636 )\n", | |
"--> 637 raise IOError(msg)\n", | |
" 639 nframes += 1\n", | |
" 641 except GeneratorExit:\n", | |
" 642 # Note that GeneratorExit does not inherit from Exception but BaseException\n", | |
" 643 # Detect premature closing\n", | |
"\n", | |
"OSError: [Errno 32] Broken pipe\n", | |
"\n", | |
"FFMPEG COMMAND:\n", | |
"ffmpeg -y -f rawvideo -vcodec rawvideo -s 100x100 -pix_fmt rgb24 -r 16.00 -i - -an -vcodec libx264 -pix_fmt yuv420p -crf 25 -vf scale=112:112 -v warning -metadata title=\"napari version x.y.z\" test.webm\n", | |
"\n", | |
"FFMPEG STDERR OUTPUT:\n", | |
"\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 54, | |
"id": "3fba55b7", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"total 10880\r\n", | |
"drwxr-xr-x 21 genevieb staff 672 20 Apr 16:57 \u001b[34m.\u001b[m\u001b[m\r\n", | |
"drwxr-xr-x 19 genevieb staff 608 20 Apr 15:30 \u001b[34m..\u001b[m\u001b[m\r\n", | |
"-rw-r--r--@ 1 genevieb staff 6148 20 Apr 16:09 .DS_Store\r\n", | |
"drwxr-xr-x 3 genevieb staff 96 20 Apr 16:01 \u001b[34m.ipynb_checkpoints\u001b[m\u001b[m\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 16:04 FFMETADATAFILE\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 15:51 FFMETADATAFILE-demo2d-main-branch\r\n", | |
"-rw-r--r-- 1 genevieb staff 128 20 Apr 16:13 FFMETADATAFILE-output-metadata-mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 108 20 Apr 16:44 FFMETADATAFILE-output-metadata-with-imageio\r\n", | |
"-rw-r--r-- 1 genevieb staff 93 20 Apr 16:10 FFMETADATAFILE-output-mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 919 12 Jan 21:35 animate2D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 939 12 Jan 21:35 animate3D.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1318 12 Jan 21:35 animateMixed.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:29 demo2D_main-branch.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331398 20 Apr 15:59 input.mov\r\n", | |
"-rw-r--r--@ 1 genevieb staff 456 12 Jan 21:35 interactive_animation.py\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381746 20 Apr 16:40 output-metadata-with-imageio.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331491 20 Apr 16:13 output-metadata.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1382418 20 Apr 16:09 output.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 331491 20 Apr 15:48 output.mp4\r\n", | |
"-rw-r--r-- 1 genevieb staff 1381635 20 Apr 15:45 testfile.mov\r\n", | |
"-rw-r--r-- 1 genevieb staff 43494 20 Apr 16:57 video-metadata.ipynb\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!ls -al" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "2d31a3f3", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.10.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment