pythonについてのメモ
python3.6 - 3.9
Attempted relative import beyond top-level packageが出た場合
https://note.nkmk.me/python-relative-import/ こちらで示された方法は現状はできない
以下のようにパスを追加して、通常のインポートをする必要がある
import sys
import os
sys.path.append(os.path.abspath(".."))
import xxx
descriptorについて
すでに良い記事があるので、そちらをとりあえず紹介しておく(手抜きって言わないで)
PyAVについて
environment
$ sw_vers
ProductName: macOS
ProductVersion: 11.2.1
BuildVersion: 20D74
$ pyenv versions ✘ system
3.8.0
* 3.9.0 (set by /Users/obara/dev/test/python/av/.python-version)
$ pip install av
既存の動画ファイルを開くと、Input Containerとなる。
import av
fh = av.open("movie.mpg")
print(fh)
<av.InputContainer 'movie.mpg'>
decode
Input Containerをdecodeするとgenerator objectが得られるのですが、その要素がFrameになります。AudioFrameかVideoFrameになります。
frame = fh.decode()
print(frame)
<generator object at 0x10aef3b80>
print(next(frame))
<av.VideoFrame #0, pts=39600 yuv420p 1280x720 at 0x10f9195e0>
demux
一方、Input Containerをdemuxすると、これもgenerator objectが得られるのですが、その要素はPacketになります。さらに、そのPacketをdecodeすると、Frameのリストが得られます。
p = fh.demux()
print(p)
<generator object at 0x10f568160>
print(next(p))
<av.Packet of #0, dts=50400, pts=50400; 1555 bytes at 0x10f90d7c0>
print(next(p).decode())
[<av.VideoFrame #3, pts=54000 yuv420p 1280x720 at 0x10f9195e0>]
stream
Containerをstreamsで参照すると、tupleチックなContainer(StreamContainer)が得られます。
さらにそれをaudioあるいはvideoで参照すると、それぞれAudioStreamのリスト、VideoStreamのリストが得られます。
print(fh.streams)
<av.container.streams.StreamContainer object at 0x10f9193a0>
print(fh.streams.audio)
(<av.AudioStream #1 mp2 at 48000Hz, stereo, fltp at 0x10f919520>,)
print(fh.streams.video)
(<av.VideoStream #0 mpeg2video, yuv420p 1280x720 at 0x10f919400>,)
仮想環境構築
$ python -m venv --prompt [project] .venv
[project]はわかりやすい文字を利用する
ここで注意が必要なのは、pyenvを利用している場合。
pyenv global とpyenv localで使い分けている人もいると思うが、当然ながら、その時点で有効なpythonを利用して仮想環境を生成するので、生成した後でpyenvで切り替えても仮想環境側には影響を与えら得ないです。