Skip to content

Instantly share code, notes, and snippets.

@GenevieveBuckley
Created April 20, 2023 08:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GenevieveBuckley/72e438539ab03c792d52040ccb9e8f02 to your computer and use it in GitHub Desktop.
Save GenevieveBuckley/72e438539ab03c792d52040ccb9e8f02 to your computer and use it in GitHub Desktop.
Video metadata with ffmpeg and imageio_ffmpeg
Display the source blob
Display the rendered blob
Raw
{
"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