Open4

pythonについてのメモ

to_obarato_obara

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
to_obarato_obara

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 Containerdecodeするとgenerator objectが得られるのですが、その要素がFrameになります。AudioFrameVideoFrameになります。

frame = fh.decode()
print(frame)
<generator object at 0x10aef3b80>
print(next(frame))
<av.VideoFrame #0, pts=39600 yuv420p 1280x720 at 0x10f9195e0>

demux

一方、Input Containerdemuxすると、これも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>,)
to_obarato_obara

仮想環境構築

$ python -m venv --prompt [project] .venv
[project]はわかりやすい文字を利用する

ここで注意が必要なのは、pyenvを利用している場合。
pyenv global とpyenv localで使い分けている人もいると思うが、当然ながら、その時点で有効なpythonを利用して仮想環境を生成するので、生成した後でpyenvで切り替えても仮想環境側には影響を与えら得ないです。