

※ByteIOについて理解しきれていない書き方をしているかもしれません。ご了承ください。  
流れとして、

⓪ PiCameraで写真を撮り、変数 `stream` に保存  
① `stream` を別の変数 `stream_save` に保存  
② `stream` を `seek()` 関数や `truncate()` 関数で処理  
③ `stream_save` はその後、別の処理  
という流れで処理したいのですが、②をした瞬間 `stream_save` まで変更されてしまい、③でバグります。

[code]

        stream_saved = io.BytesIO()
        for foo in picamera.capture_continuous(stream, "png"):
            stream_saved = stream
            print(stream_saved.tell()) #801234などの数値
            stream.seek(0)
            print(stream_saved.tell()) #0
    
[/code]

`stream_saved.tell()` の値を事前に保存することも考えたのですが、 `truncate()`
などの関数も使うことを考えると対応しきれませんでした。  
理解が浅く申し訳ないのですが、カメラから取得したbyteデータを2つの変数に保存、処理する方法を教えていただけますと幸いです。

追記  
ByteIO()関数を使用したところコピーできました。ありがとうございます。  
コピーした `stream_saved` を  
<https://picamera.readthedocs.io/en/release-1.10/recipes1.html>  
の4.9を参考に以下のコードでsocketで送信しようとしたのですが、うまく動作しませんでした。。。  
コピーした際に `.tell()`の値まではコピーされていなかったので `seek()` で元データの参照位置もコピーしたのですが  
他にも `ByteIO(stream.read())` ではコピーされない要素があるのでしょうか？

[code]

       stream_saved = io.BytesIO()
       for foo in picamera.capture_continuous(stream, "png"):
           stream_saved = io.BytesIO(stream.read())
    　　　  stream_saved.seek(stream.tell)
           connection.write(struct.pack('<L', stream_saved.tell())) 
           connection.flush()
           stream_saved.seek(0)
           connection.write(stream_saved.read()) #ここが動かない
           # Reset the stream for the next capture
           stream_saved.seek(0)
    
[/code]


CC BY-SA 4.0
2020-06-15T09:43:21.990
67683
2020-06-17T09:53:45.460
2020-06-17T09:53:45.460
25869
25869
question
python3 raspberry-pi camera stream
PiCameraから取得したstream(ByteIOデータ)を一時的に保存したい。


回答末尾のサンプルコードを参考にして、`io.BytesIO(stream.read())`でbyte[]データを複製してみてください。

ご質問のコードについて2行目でstream_savedを宣言していますが、4行目のfor文直後の`stream_saved =
stream`で2行目のオブジェクトを破棄して`stream_saved`と`stream`が同一オブジェクトを参照してしまっています。  
これによって`streamの`seek`や`truncate`でオフセットを変えたりクリアすると、`stream_saved`もオブジェクトが同じなので影響を受けます。

[code]

    import io
    stream = io.BytesIO(b'1234567890abcdef')
    
    #バイト配列を複製して新しいBytesIOを作る
    stream_saved = io.BytesIO(stream.read())
    # stream.read() でオフセットが末尾に移動するので必要に応じて戻す
    stream.seek(0)
    
    # 以下は stream と stream_saved が独立しているか調査するコード
    stream.seek(3)
    print(stream_saved.tell()) # 0
    stream.truncate()
    print(stream_saved.read()) # b'1234567890abcdef'
    
[/code]


CC BY-SA 4.0
2020-06-16T05:20:07.817
67708
2020-06-16T05:20:07.817
9820
67683
answer