我的问题是,当我使用 opencv 将视频提取到帧中时,有时我得到的帧会翻转,这发生在我的机器(窗口)和 VM(ubuntu)但我测试的一些视频中,帧不翻转。所以,我想知道应该在我的代码中更改/添加什么因素或什么来使提取物固定而不翻转
def extract_frame(video,folder):
global fps
os.mkdir('./green_frame/{folder}/'.format(folder=folder))
vidcap = cv2.VideoCapture(video)
success,image = vidcap.read()
fps = vidcap.get(cv2.CAP_PROP_FPS)
count = 0
success = True
while success: #os.path.join(pathOut,(name+'.png'))
cv2.imwrite(os.path.join('./green_frame/{folder}/'.format(folder=folder),"frame%d.png" % count), image)
success,image = vidcap.read()
print('Read a new frame: ', success)
count += 1
Run Code Online (Sandbox Code Playgroud)
这是我从这段代码中得到的框架示例。
我使用的原始视频是这样颠倒的:
所以,就我而言,我必须改变什么才能使它不像我的第一张照片那样翻转。它与视频的分辨率或帧率有关吗?我用 1280x720 分辨率的视频进行了测试,提取的所有帧都颠倒了,但是来自具有 568x320 分辨率的视频的帧是正常的
谢谢
编辑:所以,我查看了视频的信息,我发现在元数据中,它对提取到倒置帧的视频进行了 180 度旋转
但是当我检查产生非倒置帧的普通视频时,它没有旋转:180

因此,从这里开始,我该如何处理具有旋转功能的视频?
我在 GCS 中存储了一个 CSV 文件,我想将其加载到 BigQuery 表中。但我需要先进行一些预处理,所以我将其加载到 DataFrame,然后加载到 BigQuery 表
import pandas as pd
import json
from google.cloud import bigquery
cols_name_list = [....]. # column name in order
uri = "gs://<bucket>/<path>/<csv_file>"
df = pd.read_csv(uri, dtype="string")
df =df.reindex(columns=cols_name_list)
client = bigquery.Client()
job_config = bigquery.LoadJobConfig(
... # added all schema field according to table column type
)
job = client.load_table_from_dataframe(
df, "<bq_table_id>", job_config=job_config
)
job.result()
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,我对数据帧列顺序进行了重新排序,以与 BigQuery 表中的顺序相匹配(不确定这是否重要),并将所有列转换为字符串类型。
我收到此错误,如下所示
pyarrow.lib.ArrowInvalid: Could not convert '47803' with type str: tried to convert to int …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 python 函数,使用 moviepy 将一个视频中的视频添加到另一个视频(没有声音)。首先,我尝试了
clip = mpe.VideoFileClip(video-to-add-sound.mp4)
clip = clip.set_audio(mpe.AudioFileClip(video-that-has-sound.mp4))
Run Code Online (Sandbox Code Playgroud)
这没有任何作用。所以,我意识到我没有 write_videofile 来剪辑所以,我创建了一个函数
def addAudioBack(original_vid, processed_vid):
clip = mpe.VideoFileClip(processed_vid)
clip = clip.set_audio(mpe.AudioFileClip(original_vid))
clip.write_videofile(processed_vid,codec='libx264')
Run Code Online (Sandbox Code Playgroud)
它将把original_vid 中的音频添加到processed_vid 中,并将旧的processed_vid 覆盖到具有orignal_vid 中音频的新音频。声音效果很好,但问题是我的视频比特率和数据率正在下降,这使得视频质量看起来更差。我尝试添加bitrate='3000k'到最后一行,但它不起作用。原版的速度约为3000kbps,但编辑后的速度降至约300kbps或以下。
附言。我编辑了最后一行,以免覆盖旧文件并写入新文件。比特率提高到大约 900kbps,但我想要的是与我的旧视频具有相似比特率的视频(将添加声音)
那么,我如何根据上述目的编写视频,使其与原始视频具有相同或几乎相同的比特率?
谢谢
我有一个带有 gzip 文件(.json.gz)的 json 压缩文件,存储在 Google Cloud Storage 的存储桶中,我想在其中读取它并将其复制到 postgres 表中。我的 json.gz 文件只是一个 json 文件,其中没有嵌套对象,如下所示:
\n[{\n\xe2\x80\x9cdate\xe2\x80\x9d: \xe2\x80\x9c2019-03-10T07:00:00.000Z\xe2\x80\x9d,\n\xe2\x80\x9ctype\xe2\x80\x9d: \xe2\x80\x9cchair\xe2\x80\x9d,\n\xe2\x80\x9ctotal\xe2\x80\x9d: 250.0,\n"payment": "cash"\n},{\n\xe2\x80\x9cdate\xe2\x80\x9d: \xe2\x80\x9c2019-03-10T07:00:00.000Z\xe2\x80\x9d,\n\xe2\x80\x9ctype\xe2\x80\x9d: \xe2\x80\x9cshirt\xe2\x80\x9d,\n\xe2\x80\x9ctotal\xe2\x80\x9d: 100.0,\n"payment": "credit card"\n},{\n.\n.\n}]\nRun Code Online (Sandbox Code Playgroud)\n以前,我使用 csv 文件做过类似的工作,在该文件中我可以使用download_as_string函数并将其存储在变量中,并用于StringIO将该变量转换为类似文件的对象,并copy_expert()在查询中使用函数(此链接)。
那么,如何在 GCS 中读取 json.gz 文件并使用 Python 将其写入表中呢?
\n我曾尝试使用 ffmpeg 从视频文件中提取音频,这是我的代码
import io
import os
import subprocess
def extract_audio(video,output):
command = "ffmpeg -i '{video}' -ac 1 -f flac -vn '{output}'"
subprocess.call(command,shell=True)
extract_audio('dm.MOV','dm-new.flac')
Run Code Online (Sandbox Code Playgroud)
编译后我没有错误。通过这样做,我应该得到一个名为“dm-new.flac”的新文件。但是我编译脚本后没有创建这样的flac文件。我认为语法或变量“命令”中的某些内容有问题,我不知道要解决此问题。我的问题是如何在基于此代码的 python 函数中使用 ffmpeg?
顺便说一句,我知道我可以只使用 ffmpeg 而无需编写函数。但我真的需要写在一个函数中。谢谢
我在清单中有一个看起来像这样的清单
[['a', 9] , ['b', 1] , ['c', 4] , . . ., ['z', 2]]
Run Code Online (Sandbox Code Playgroud)
从这里开始,我要逐行打印出列表中的每个列表,如下所示
['a',9]
['b',1]
.
.
['z',2]
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用循环将其打印出来,如下所示:
for i in list:
print(i)
Run Code Online (Sandbox Code Playgroud)
但是我的问题是,不使用循环就可以做到吗?就像只打印一行而不与循环交互的一行。(我打算与某些警报功能一起使用,因此我希望它位于包含所有列表的大消息中,而不是包含每个列表的多条消息中)
我已经试过了:
print(list, sep='\n')
Run Code Online (Sandbox Code Playgroud)
但不会将每个列表分成一行。我也试过这个:
print('\n'.join(list))
Run Code Online (Sandbox Code Playgroud)
并发生此错误:
TypeError: sequence item 0: expected str instance, list found
Run Code Online (Sandbox Code Playgroud)
这似乎不适用于列表中的列表。任何的想法?