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

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

ただいまの
回答率

90.51%

  • Java

    15827questions

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

  • Android

    7298questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4298questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

mp4parserによる動画と音楽の結合について動画と結合されない。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,171

shimokawa01

score 18

現在,android studio にて動画編集アプリを作成しております。
mp4parserというライブラリをもちいて開発を行っているのですが、audio部分のトラック型への変換がうまくいきません。
ファイルのpathは取得できているのですが、
なぜか反映されません。何か原因なのでしょうか?

動画と音楽を結合させて再生させるにはどうすればいいでしょうか?

特にエラーが出ないのでどうデバッグすればよろしいのでしょうか?

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.content.Intent;
import android.util.Log;
import android.widget.VideoView;
import java.util.ArrayList;
import com.googlecode.mp4parser.authoring.Movie;
import com.googlecode.mp4parser.authoring.container.mp4.MovieCreator;
import com.googlecode.mp4parser.authoring.Track;
import java.util.LinkedList;
import java.util.List;
import com.googlecode.mp4parser.authoring.tracks.AppendTrack;
import com.coremedia.iso.boxes.Container;
import com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder;
import java.io.FileOutputStream;
import java.io.File;
import android.content.pm.ActivityInfo;
import com.googlecode.mp4parser.FileDataSourceImpl;
import com.googlecode.mp4parser.authoring.tracks.AACTrackImpl;


public class VideoPreview extends AppCompatActivity {

    ArrayList<String> videolist = new ArrayList<String>();
    File appdir;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        setContentView(R.layout.activity_video_preview);

        // インテントを取得
        Intent intent = getIntent();
        // インテントに保存されたデータを取得
         videolist = intent.getStringArrayListExtra("videolist");


        //videolistには録画されたファイルのパスがarraylistで格納されています。



            if (!append()){
       //appendメソッドに投げて動画の結合を行います。
                finish();
            }else{

                File itemvideo = new File(getFilesDir().toString() + "/VideoGallery");

                VideoView videoView = (VideoView)findViewById(R.id.videoView);
                videoView.setVideoPath(appdir + "/video.mp4");

    //            appendにて出力されたファイル先を指定して再生させます。
                videoView.start();

                videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        Intent backintent = new Intent(VideoPreview.this, VideoGallery.class);
//
//        // 指定のActivityを開始する
                        startActivity( backintent );
                    }
                });
            }

    }

    private boolean append() {
        try {
       
//      動画のオブジェクトを作成
            Movie inMovies[] = new Movie[videolist.size()];

//       パスの要素数分ビルド
            for (int i = 0;i < videolist.size(); i++){
                inMovies[i] = MovieCreator.build(videolist.get(i));
            }

     
//       音楽ファイルの取得
            String audiopath = "android.resource://" +  getPackageName() +  "/" + R.raw.sample;


//               Track型に変換
            AACTrackImpl audio = new AACTrackImpl(new FileDataSourceImpl(audiopath));

//            Log.e("audiofile",audio.toString());

            // 1つのファイルに結合
            List<Track> videoTracks = new LinkedList<Track>();
            List<Track> audioTracks = new LinkedList<Track>();

            for (Movie m : inMovies) {
                for (Track t : m.getTracks()) {
                    if (t.getHandler().equals("vide")) {
                        videoTracks.add(t);
                    }

                    audioTracks.add(audio);

                }

            }


            Movie result = new Movie();
            if (audioTracks.size() > 0) {
                result.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
            }
            if (videoTracks.size() > 0) {
                result.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
            }

            // 出力
            Container out = new DefaultMp4Builder().build(result);

            appdir = new File(getFilesDir().toString() + "/EditVideo");

            if (!appdir.exists()) {
                appdir.mkdir();
            }

            int cnt = appdir.listFiles().length;
            cnt = cnt++;

            String outputFilePath = appdir + "/video.mp4";

            FileOutputStream fos = new FileOutputStream(new File(outputFilePath));
            out.writeContainer(fos.getChannel());
            fos.close();
        } catch (Exception e) {
            return false;
        }

        return true;

    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

同じタグがついた質問を見る

  • Java

    15827questions

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

  • Android

    7298questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4298questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。