8

ここでは、最初と 2 番目の 30 秒のビデオ ファイルを「path/connect.webm」から文字列 out と out1 にカットしようとしました。できます。しかし、私がしなければならないことは、これら 2 つの文字列を連結し、それをファイル「path/final.webm」に書き込むことです。最後に 60 秒の動画ファイル「final.webm」を取得します。しかし、今では出力として最初の 30 秒のビデオのみを取得しています。私を助けてください。よろしくお願いします。

Python でのコード:

import subprocess,os

fname = "/home/xincoz/test/final.webm"

fp = open(fname,'wb')

ffmpeg_command = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy",   "-ss", "00:00:00", "-t", "00:00:30","-f", "webm", "pipe:1"]

p = subprocess.Popen(ffmpeg_command,stdout=subprocess.PIPE)

out, err = p.communicate()

ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy",   "-ss", "00:00:31", "-t", "00:00:30","-f", "webm", "pipe:1"]

p1 = subprocess.Popen(ffmpeg_command1,stdout=subprocess.PIPE)

out1, err1 = p1.communicate()

string = out + out1

print len(out)

print len(out1)

print len(string)

fp.write(string)

fp.close()

私を助けてください。

4

3 に答える 3

14

これは、最初にビデオをプログラムで処理しようとするときに、まともな人なら誰でも尋ねる 2 つの質問のうちの 1 つに思えます。「好きな部分を切り取って貼り付けられないのはなぜですか?」本当に説明できる人は質問にうんざりしていて、私のように自分である程度理解している人は愚かに見えたくないので、誰も答えません。しかし、私は気にしません - これが実際的な答えです。

複雑なコンテナー形式をクリップして結合するには、想像以上に複雑であり、少なくともコンテナーごとのソリューションが必要です。

ffmpeg faq を読んだ場合、理論的にはビデオを mpg-v1 として再フォーマットし (おそらく mpg-v2 も機能します)、多かれ少なかれあなたがしていることを行うことでビデオを連結できます。

cat first_part.mpg second_part.mpg > joined_movie.mpg

実際には、joined_movie.mpg はスムーズに実行される場合とそうでない場合があります。この非常に単純な形式でさえ、明らかに「このファイルは 1 分の長さです」などのデータが前もって表示されます。したがって、それを開いてわずか 30 秒であることを発見するかもしれませんが、1 分間再生されることがわかります (プレーヤーによっては再生されない場合もあります)。簡単に正すことができます(ロスレスであると仮定します。そうしないと、ffmpeg FAQ では推奨されません)。

しかし、究極的には mpg-v1 を使いたくないでしょう。Webm は妥当な選択かもしれません。私が収集したものから、webm コンテナーは MKV から派生しています。オーディオには vorbis を使用し、ビデオには vp8 を使用します。ある素人から別の素人へ: vp8 ~ H264 (これを読んで心臓発作を起こした doom9 フォーラムの誰かに謝罪します)。とにかく、私たち素人にとって重要な点は、単純であるだけでなく、実際には非常に複雑であることです.すべてのエンコーダーパラメーターを理解するだけでも一生の仕事です.

mp4box は、mp4 コンテナー内の h264 ビデオで、あなたが望むものにかなり近いことを実行できることを知っています。主にプログラムでビデオをカットして参加できるようにしたい場合は、代わりに mp4/h264 を採用することもできますが、自由を支持し、イデオロギー的または金銭的な理由で webm を使用したい場合があります。webm 内で解決策が見つかった場合は、興味があります。mkvコンテナに近いことを考えると、おそらくmkvtoolは機能しますか?

Web ビデオについて話していることを考えると、ファイルはストリーミング用に準備されていると思います。したがって、それらを一緒に追加することができるはずだと思われるかもしれません。ただし、すべてがチャンクでインターリーブされている場合でも、それらを追加するだけでなく、追加してからヘッダー/メタデータを合計再生時間に合わせて調整するよりも、かなり複雑にする必要があります。機能するツールは多くなく、mp4box でさえ常にこれを確実に/正確に実行できるとは限らないため、複雑さを推測しています。

mp4 を使用する場合は、mp4box にファイルを結合するように指示できます。

mp4box -cat file1 -cat file2 -new joined

おそらく、フリーソフトウェアの愛国者が、再エンコードせずにコマンドラインから webm ファイルを切り取り、結合する方法を投稿するでしょう。

あなたのプロジェクトで頑張ってください。

于 2013-06-30T08:03:35.230 に答える
10

このコードは私にとってはうまくいきます。大変お世話になりました。どうもありがとう。

import subprocess
ffmpeg_command1 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:00", "-t", "00:00:30", "/home/xincoz/test/output1.webm"]
ffmpeg_command2 = ["ffmpeg", "-i", "/home/xincoz/test/connect.webm", "-acodec", "copy", "-ss", "00:00:30", "-t", "00:00:30", "/home/xincoz/test/output2.webm"]
ffmpeg_command3 = ["mencoder", "-forceidx", "-ovc", "copy", "-oac", "pcm", "-o", "/home/xincoz/test/output.webm", "/home/xincoz/test/output1.webm", "/home/xincoz/test/output2.webm"]


subprocess.call(ffmpeg_command1)
subprocess.call(ffmpeg_command2)
subprocess.Popen(ffmpeg_command3)
于 2013-07-01T03:37:54.003 に答える