質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1225閲覧

FileOutputStreamで出力したファイル(mp4)が再生できない

Hoge2017

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/10/20 01:27

編集2017/10/20 01:49

###前提・実現したいこと
mp4ファイルをInputStreamで一定バイトごとに分割し読み取り、ファイル出力したい。
###発生している問題・エラーメッセージ
出力された各ファイルの内、1つ目に分割されたファイル以外のmp4が再生できない。

■関連の質問URL
受け取ったInputStreamをReadメソッドで一定のバイト数毎に読み込みアップロードしたい
↑こちらで頂いたご回答を参考に、データ分割には成功しました。
###該当のソースコード

public class InputStreamSplit { public static void main(String[] args) { File file = new File("C:/testdata.mp4"); try { InputStream inputStream; inputStream = new FileInputStream(file); splitAndOutput(inputStream); } catch (Exception e1) { e1.printStackTrace(); } } public static void splitAndOutput(InputStream in) throws IOException { int offset; int bytesRead; byte[] data = new byte[5242880];// バッファ boolean next; int outerLoop = 0; int innerLoop = 0; String renban = ""; do { offset = 0; // offsetのリセット Arrays.fill(data, (byte)0); next = false; while ((bytesRead = in.read(data, offset, data.length - offset)) != -1) { offset += bytesRead; innerLoop++; if (offset >= data.length) { System.out.println(data.length); next = true; break; } } if (offset >= 1) { ByteArrayInputStream bais = new ByteArrayInputStream(data, 0, offset); // ByteArrayInputStream bais = new ByteArrayInputStream(data); renban = String.format("%03d", outerLoop); FileOutputStream fos = new FileOutputStream("C:/output"+renban+".mp4"); fos.write(data); bais.close(); fos.close(); } outerLoop++; } while(next); } }

初心者のため、メソッドの利用法など、そもそも間違っているかもしれません。
誤りの箇所、修正方法など、もし分かりましたらご指摘いただきたいです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ファイルフォーマットについて調べてください。

プログラム、コンピュータの世界は0と1を表す現象の上に、
いくつもの決まり事が重なって成り立っています。
ファイルも例外ではありません。

その決まり事を無視しては、ただ0と1が不定期に入れ替わっている現象の集まりでしかなくなります。

MP4のファイルファーマットという決まり事を守って作られた1つのファイルから、
一定サイズ毎に切り取ったファイルの1つ1つには、もはや何の決まり事も存在していません。

しかし、切り取ったのであれば、その順番を守ってくっつけてやれば、元通りになるはずです。
つまり、再生したかったら、ファイル同士(あるいはデータ)を順番を守って結合してやる必要があります。

投稿2017/10/20 02:22

abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hoge2017

2017/10/23 06:20

ありがとうございます。 基本的な部分を勉強しなおします。
guest

0

ベストアンサー

mp4ファイルあるいは画像ファイル(jpeg, png, etc.)などのようなファイルは、先頭にヘッダー情報があって、ファイル内のどの位置に何があるといった構成になっているため分割すると正常に解釈できなくなると思います。

いくつかに分割した結果が正しいかを確認するならそれらを元の順番に連結してから確認してみてください。

例えば元のmp4ファイルをa1, a2, a3の3つに分割した場合、コマンドプロンプト上で

copy /b a1 + a2 + a3 a.mp4

として3つのファイルを連結したa.mp4を作成し、a.mp4が再生できるかを確認するといった具合です。

投稿2017/10/20 01:53

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hoge2017

2017/10/20 02:17

ご回答ありがとうございます。 先頭にヘッダー情報があるというのは知りませんでした。 ヘッダー情報が先頭にあるため、1個目に分割されたデータのみ再生できると思ってよいのでしょうか? ちなみに、コマンドをうってみましたが、構文が間違っているらしく、ダメでした、、 C:\Users\SampleUser\Desktop>copy /b testdata000.mp4 + testdata001.mp4 + testdata00 2.mp4 + testdata003.mp4 + testdata004.mp4 + testdata005.mp4 + testdata006.mp4 + testdata007.mp4 + testdata008.mp4 testdata009.mp4 + testdata010.mp4 + testdata01 1.mp4 testdataout.mp4 コマンドの構文が誤っています。
KSwordOfHaste

2017/10/20 03:10

う・・・自分もググって書いただけで確認してませんでした。ちょっとみてみます。
KSwordOfHaste

2017/10/20 03:19

Windows10にてプログラムの名前を指定して実行で"cmd"とうってコマンドプロンプトを起動し、やってみたところ一応できました。しかし、例えばPowershellでは PS C:\Users\KSOH\tmp> copy /b a1 + a2 + a3 a4 Copy-Item : 引数 '+' を受け入れる位置指定パラメーターが見つかりません。 発生場所 行:1 文字:1 + copy /b a1 + a2 + a3 a4 + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Copy-Item]、ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.CopyItemCommand という(質問者さんとは違う)エラーになりました。 コマンドプロンプト(プログラム名 cmd)を使ってますか?
KSwordOfHaste

2017/10/20 03:43

あ・・・testdata008.mp4 testdata009.mp4の間に'+'入れ忘れてますよ?
Hoge2017

2017/10/23 06:19

ファイルの数を減らしたところ、なぜか出来ました。 ありがとうございました。
KSwordOfHaste

2017/10/23 06:27

んー、直前のコメントで連結するファイル名の引数の間に'+'を指定し忘れているという指摘をしました。 それが原因だったかどうかお答えがありませんが・・・今後同様のことをやる際に気を付けてみてください。
Hoge2017

2017/10/23 06:34

すみません、+は入れておりました。
KSwordOfHaste

2017/10/23 06:47

そうでしたか。了解です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問